gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:09:17 29 4
gpt4 key购买 nike

我正在使用 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 

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

我在 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();
}
}
}

我正在使用 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.");
}
}

对可能出现的问题有什么想法吗?

最佳答案

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

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

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

并参加了一个C:

你可以用它来获得灵感,把事情做好。

最后,我确实经常遇到 XBee 和电路板之间的接触问题(使所有传入的数据报出错等)。每次数据出错时,您可能希望重启和/或重新插入 xbee 加密狗(因此需要检查传入的数据报)。

关于java - BufferedReader 在从 USB 读取时跳过随机字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16240241/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com