我正在使用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端口读取的代码如下所示。它在自己的Thread中运行。
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();
}
}
}
我正在使用RXTXcomm.jar,此处http://rxtx.qbang.org/wiki/index.php/Main_Page
这是我打开端口的地方。
while (!connected && !timedOut) {
System.out.print("\n\nConnecting 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.");
}
}
关于可能出现什么问题的任何想法?
答案 0 :(得分:1)
screen /dev/ttyUSB0 SPEED
或python -m serial.tools.miniterm
或minicom
。
你所说的打印出的垃圾确实是帧数据。您可以在XBee手册中找到它是如何构建的(~
字符标记API模式中新帧的开头,后跟帧类型,长度,内容和CRC)。给定CRC,您可以检查帧是否被正确读取,如果没有丢失位。
我用C ++编写了一个XBee数据报解析器:
并参加了一次C:
你可以用灵感来解决问题。
最后,我经常遇到XBee和电路板之间的问题(使所有传入的数据报错误等等)。每次数据出错时,您可能需要重新启动和/或重新插入xbee加密狗(因此需要检查传入的数据报)。