BufferedReader从USB读取时跳过随机字符



我正在使用BufferedReader从USB网关读取数据,该网关定期从Arduino设备接收ZigBee网络帧。

框架应该是这样的:

~f�}3�@v<-,R#}3�@v<--mac:0013A20040763C2D -H:-25.80 -T:22.58 -L:2.6451 -N:100.00 -D:0.0290 -B:35 

但是,它总是缺少MAC地址末尾的一些字符,像这样:

~f�}3�@v<-,R#}3�@v<--mac:0013A2004076D -H:-25.80 -T:22.58 -L:2.6451 -N:100.00 -D:0.0290 -B:35 

~f�}3�@v<-,R#}3�@v<--mac:0013A2004076C2:-25.80 -T:22.58 -L:2.6451 -N:100.00 -D:0.0290 -B:35 

开头的垃圾是低级网络报头信息,我猜。

我使用的是Ubuntu,使用

从终端读取时,帧显示得非常好
cat /dev/ttyUSB0

我用来从USB端口读取的代码看起来像这样。它在自己的线程中运行。

public void run() {
    Boolean keepRunning = true;
    BufferedReader br = new BufferedReader(new InputStreamReader(portReader.getInputStream()));
    String line;
    while (keepRunning) {
        try {   
            while ((line = br.readLine()) != null) {
                handleData(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

我使用rxtxcom .jar,可在这里http://rxtx.qbang.org/wiki/index.php/Main_Page

这是我打开端口的地方。

while (!connected && !timedOut) {
                System.out.print("nnConnecting to " + portName);
                //Open Ports
                CommPort commPort = portIdentifier.open(this.getClass()
                        .getName(), 9600);
                //TODO Should we rule out other kinds?
                if (commPort instanceof SerialPort) {
                    //Pass the open port
                    SerialPort serialPort = (SerialPort) commPort;
                    serialPort.enableReceiveTimeout(15000);
                    //Configure the port communication interface
                    serialPort.setSerialPortParams(bauds,
                            SerialPort.DATABITS_8, SerialPort.STOPBITS_1,
                            SerialPort.PARITY_NONE);
                    //Open a stream and read from the port
                    inputStream = serialPort.getInputStream();
                    int portBuffer = inputStream.read();
                    //Check if there is something in the buffer, which
                    //means that a connection was established
                    if (portBuffer > -1) {
                        connected = true;                           
                    } else {
                        System.err.println("Connection to " + portName
                                + " timed out");
                        serialPort.close();
                        inputStream.close();
                        timedOut = true;
                    }
                } else {
                    System.err
                            .println("Error: Only serial ports are handled by this application.");
                }
            }

你知道哪里出了问题吗?

嗯,我不确定这是否是问题所在,但你不应该在串行端口char设备上运行,因为它不会正确设置串行设备(具有正确的速度读取,奇偶校验等)。和无缓冲的)。始终使用screen /dev/ttyUSB0 SPEED,或python -m serial.tools.minitermminicom

你所说的打印出来的垃圾确实是帧数据。您可以在XBee手册中找到它是如何构建的(~字符标记API模式下新帧的开始,然后是帧类型,长度,内容和CRC)。有了CRC,你可以检查帧是否被正确读取,如果没有丢失的位。

我用c++写了一个XBee数据报解析器:

  • https://github.com/guyzmo/polluxnzcity/blob/master/PolluxGateway/src/xbee/xbee_communicator.C

并参加了C中的一个:

  • https://github.com/guyzmo/xbee-comm/blob/master/src/lib/xb_buffer.c

你可以用它来激励你把事情做好。

最后,我在XBee和主板之间经常有接触问题(使所有传入的数据报错误等)。每次数据出错时,您可能需要重新启动电源循环和/或插入xbee加密狗(因此需要检查传入的数据报)。

最新更新