私は自分のRFIDリーダーをラズベリーパイ3のGPIOピンに接続しました。 vcc、gnd、data0およびdata1ここで、data0とdata1はpull_up(HIGH)に設定され、0bitが読み出されるとdata0がLOWにエッジ処理され、1が読み出されるとdata1がLOWにエッジングされます。私はpythonとjavaプログラムを書いた。それはPythonにはうまくいきましたが、javaではうまくいきませんでした。ここにPythonコードがあります:ラズベリーPI用のGPIOリスナーは、pi4jを使用してランダムに呼び出されます。
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(True)
chan_list = [17,27]
GPIO.setup(chan_list, GPIO.IN, pull_up_down=GPIO.PUD_UP)
counter = 0
test_counter = 0
def my_callback(channel):
global counter
counter += 1
GPIO.add_event_detect(17, GPIO.FALLING, callback=my_callback)
GPIO.add_event_detect(27, GPIO.FALLING, callback=my_callback)
while(True):
print "counter =",counter
ここでは、ビットが読者によって読み取られるとカウンタが更新されます。ここではカウンタ値は26です。pi4jを使用してJavaで実行しようとしたとき、リスナーは26時間呼び出されません。カウンタは26回更新されません。ここではJavaのコードです。
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalInput;
import com.pi4j.io.gpio.PinPullResistance;
import com.pi4j.io.gpio.RaspiPin;
import com.pi4j.io.gpio.event.GpioPinDigitalStateChangeEvent;
import com.pi4j.io.gpio.event.GpioPinListenerDigital;
import com.pi4j.wiringpi.GpioInterrupt;
import com.pi4j.io.gpio.PinState;
import com.pi4j.io.gpio.*;
import com.pi4j.util.CommandArgumentParser;
public class ListenGpioExample {
public static void main(String args[]) throws InterruptedException {
ListenGpio listenGpio = new ListenGpio();
listenGpio.run(args);
}
}
class ListenGpio{
int counter ;
public void run(String[] args){
System.out.println("<--Pi4J--> GPIO Listen Example ... started.");
final GpioController gpio = GpioFactory.getInstance();
Pin pin = CommandArgumentParser.getPin(RaspiPin.class, RaspiPin.GPIO_00, args);
Pin pin2 = CommandArgumentParser.getPin(RaspiPin.class, RaspiPin.GPIO_02, args);
PinPullResistance pull = CommandArgumentParser.getPinPullResistance(PinPullResistance.PULL_UP, args);
final GpioPinDigitalInput myButton = gpio.provisionDigitalInputPin(pin,pull);
final GpioPinDigitalInput myButton2 = gpio.provisionDigitalInputPin(pin2,pull);
myButton.setShutdownOptions(true);
myButton2.setShutdownOptions(true);
myButton.addListener(new GpioPinListenerDigital() {
@Override
public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) {
counter += 1;
}
});
myButton2.addListener(new GpioPinListenerDigital() {
@Override
public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) {
counter += 1;
}
});
for (;;) {
System.out.println("counter =="+counter);
}
}
}
このJavaコードでは、カウンタ値はランダムに1または2です。私は26ビットのデータを送信しているので、26でなければなりません。誰も私にこの問題を解決する方法を教えてもらえますか? Pythonコードで正常に動作するので、回路接続は問題ありません。