我的Wiegand RFID阅读器(26位)有问题。我已经编写了简单的Java应用程序,一切似乎都很好。但是例如读取10次后,它开始移位位。 RPi Raspbian是否因Wiegand时间协议而变慢?

这是示例代码和输出

package classes;


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;
public class Test {


    public static char[] s = new char[10000];
    static int bits = 0;

    public static void main(String[] args) {
        // create gpio controller
        final GpioController gpio = GpioFactory.getInstance();

        // provision gpio pin #02 as an input pin with its internal pull down
        // resistor enabled
        final GpioPinDigitalInput pin0 = gpio.provisionDigitalInputPin(RaspiPin.GPIO_00, PinPullResistance.PULL_UP);

        final GpioPinDigitalInput pin1 = gpio.provisionDigitalInputPin(RaspiPin.GPIO_01, PinPullResistance.PULL_UP);

        System.out.println("PINs ready");
        Thread th = new Thread(new Runnable() {

            @Override
            public void run() {

                while (true) {

                    if (pin0.isLow()) { // D1 on ground?
                        s[bits++] = '0';
                        while (pin0.isLow()) {

                        }

                    }

                    if (pin1.isLow()) { // D1 on ground?
                        s[bits++] = '1';
                        while (pin1.isLow()) {
                        }

                    }

                    if (bits == 26) {
                        bits=0;

                        Print();

                    }

                }

            }
        });
        th.setPriority(Thread.MAX_PRIORITY);
        th.start();
        System.out.println("Thread start");

        for (;;) {
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

    protected static void Print() {

        for (int i = 0; i < 26; i++) {
            System.out.write(s[i]);

        }
        System.out.println();
        bits = 0;

    }

}


并输出:

10100100111111110110011011
10100100111111110110011011
10100100111111110110011011
10100100111111110110011011
10100100111111110001101110
10010011111111011001101110
10010011111111011001101110
10010011111111011001101110
10010011111111011001101110
10010011111111011001101110
10010011111111011001101110

最佳答案

您的printf语句可能是导致问题的原因。尝试存储数据并在最后打印。 printf往往很慢(它涉及多个上下文切换)。

另外,似乎您无法检测是否错过了一点。我会说尝试超时,所以如果您没有及时获得26位,请重置计数器。这样一来,您就不会无所事事,最终会得到未对齐的数据。

09-27 09:04