2017-01-24 6 views
0

私は自分の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コードで正常に動作するので、回路接続は問題ありません。

答えて

0

私は探している出力を与える上記の問題のためにwiringpiを使って別の方法で試しました。それでも、私は上記のルーチンで何が問題か分からなかった。ここで私が投稿していますソリューションです:

import com.pi4j.wiringpi.Gpio; 
import com.pi4j.wiringpi.GpioInterruptCallback; 
public class RFIDAndroid { 
public static void main(String args[]) throws InterruptedException{ 
    RFIDReader rfidReader = new RFIDReader(0,2); 
    rfidReader.readRFID(); 
} 

}

class RFIDReader{ 
    int cardCode; 
    int facilityCode; 
    int data0; 
    int data1; 
    int counter =0; 
    int flagDone = 0; 
    int timer_count = 3000; 
    int[] databits = new int[100]; 

    RFIDReader(int data0,int data1){ 
      this.data0= data0; 
      this.data1=data1; 
    } 

    int getCardCode(){ 
      return cardCode; 
    } 
    int facilityCode(){ 
      return facilityCode; 
    } 

    void readRFID() throws InterruptedException{ 
      if (Gpio.wiringPiSetup() == -1) { 
        System.out.println(" ==>> GPIO SETUP FAILED"); 
        return; 
      } 
      Gpio.pinMode(data0, Gpio.INPUT) ; 
      Gpio.pinMode(data1, Gpio.INPUT) ; 
      Gpio.pullUpDnControl(data0, Gpio.PUD_UP); 
      Gpio.pullUpDnControl(data1, Gpio.PUD_UP); 

      Gpio.wiringPiISR(data0, Gpio.INT_EDGE_FALLING, new GpioInterruptCallback() { 
        @Override 
        public void callback(int pin) { 
          flagDone = 0; 
          databits[counter] = 1; 
          counter +=1; 
          timer_count = 3000; 
        } 
      }); 

      Gpio.wiringPiISR(data1, Gpio.INT_EDGE_FALLING, new GpioInterruptCallback() { 
        @Override 
        public void callback(int pin) { 
          flagDone = 0; 
          databits[counter] = 0; 
          counter +=1; 
          timer_count = 3000; 
        } 
      }); 

      while(true){ 
        if (flagDone ==0) { 
          timer_count -= 1; 
          if (timer_count == 0){ 
            flagDone = 1; 
          } 
        } 
        if (counter > 0 && flagDone ==1) { 
         int i; 
         if (counter == 35) 
         { 
          for (i=2; i<14; i++) 
          { 
          facilityCode <<=1; 
          facilityCode |= databits[i]; 
          } 
          for (i=14; i<34; i++) 
          { 
          cardCode <<=1; 
          cardCode |= databits[i]; 
          } 
         } 
         else if (counter == 26) 
         { 
          for (i=1; i<9; i++) 
          { 
          facilityCode <<=1; 
          facilityCode |= databits[i]; 
          } 
          for (i=9; i<25; i++) 
          { 
          cardCode <<=1; 
          cardCode |= databits[i]; 
          } 
         } 
         else { 
          facilityCode = -1; 
          cardCode = -1; 
         } 

         System.out.println("cardCode ="+cardCode); 
         System.out.println("facility Code="+facilityCode); 
         counter = 0; 
         facilityCode = 0; 
         cardCode = 0; 
         for (i=0; i< 100; i++) 
         { 
          databits[i] = 0; 
         } 

          } 
        } 
      } 
    } 
関連する問題