Java 试图通过串行扫描仪读取数据不';我看不清整行
我正在做一个项目,在那里我在一个Java 试图通过串行扫描仪读取数据不';我看不清整行,java,java.util.scanner,Java,Java.util.scanner,我正在做一个项目,在那里我在一个Arduino上获取传感器数据,它通过串口将数据打印到我的笔记本电脑上。当我使用Arduino IDE时,它可以与串行监视器配合使用。(完整消息如下所示:1-35251 58152)。-后面的字符是UID,因此它们应该始终与我仅使用一个设备进行测试的字符相同 当我试图通过Java阅读这篇文章时,我会收到不同的消息(或者至少是不完整的消息) 上面的方法启动我正在使用的USB端口。 经过一些检查后,我尝试如下读取端口(删除了try-catch和其他与此问题无关的代码)
Arduino
上获取传感器数据,它通过串口将数据打印到我的笔记本电脑上。当我使用Arduino IDE时,它可以与串行监视器配合使用。(完整消息如下所示:1-35251 58152
)。-
后面的字符是UID,因此它们应该始终与我仅使用一个设备进行测试的字符相同
当我试图通过Java阅读这篇文章时,我会收到不同的消息(或者至少是不完整的消息)
上面的方法启动我正在使用的USB端口。
经过一些检查后,我尝试如下读取端口(删除了try-catch和其他与此问题无关的代码)
我还尝试了以下方法:
Scanner data = new Scanner(myPort.getInputStream());
if (data.hasNextLine()) {
String line = data.nextLine();
System.out.println("readUSB: " + line);
}
我从System.out.println(“readUSB:+line”)中得到的结果代码>如下所示:
readUSB: �
readUSB: 152
readUSB: 9-35 251 58 152
readUSB: 152
readUSB: 1-35 251 58 152
readUSB: 5 251 58�152
readUSB: 251 58 152
readUSB:
readUSB: 58 152
正如您所看到的(消息中有一些噪音),这些消息中的大多数都不完整
谁能告诉我是什么原因造成的,以及如何修复
[编辑]
当我使用LoRa将数据从一个传感器传输到另一个Arduino时,我将数据收集为字符。Arduino和我的USB端口在38400时使用相同的波特率。我觉得错误可能在下面的代码中,因为当我连接传感器USB(而不是通过LoRa发送)时,值实际上是正确的
if (packetFound) {
// Print the packet over Serial per character
Serial.println();
for (int i=0; i<19; i++) { //20 and 21 are squares
Serial.print(char(RxData[i]));
RxData[i] = 0x00; // Clear buffer [0x20 -> space]
}
}
if(packetFound){
//按字符以串行方式打印数据包
Serial.println();
for(int i=0;i空间)
}
}
我似乎无法摆脱这个问题,但我注意到了以下几点
如果我在Arduino中的消息前面添加一个字符串,我会得到如下结果:
- readUSB:llo World:9-35251 58152(显然它应该说
Hello World
)
我目前的解决方案是在Arduino中的字符串开头添加一组10个#
字符,然后从字符串中过滤出来
while (line.charAt(0) == '#') { // Remove all the # chars in front of the real string
line = line.substring(1, line.length());
}
正如注释中所建议的:编写此代码的更好方法:
int i = 0;
while (line.charAt(i) == '#') {
i++;
}
line = line.substring(i);
我接受这个答案,因为它解决了我的问题。但是如果有人有一个真正的(好的)此问题的解决方案,请发布,我将接受。非常简单的问题,但我应该问一下,对不起。您确定波特率匹配吗?请添加arduino代码您是否使用匹配的字符集?为什么不使用InputStream
从串行数据读取数据?两个与输入相关的有用资源Stream
:1.2.所有数据包的长度是否正好为19个字符?另外,RxData的类型是什么,数组在哪里分配?我确实有匹配的波特率;我无法确认是否有匹配的字符集,但它可以从带传感器的Arduino中工作,因此我猜其他Arduino也会相同;没有尝试使用InputStream
,当然,我会仔细研究一下;所有数据包都有21个字符,但最后2个字符并不重要(总是2个正方形,它们不能显示在注释部分)。这不是处理字符串的有效方法,因为substring()
将创建一个新的字符串
对象N次,旧字符串将被释放到垃圾收集器。最好找到字符串中第一个非-#的索引(while(line.charAt(i)='#')++i;
)这不会解决您的问题,但只是对字符串处理最佳实践的一般性评论。
while (line.charAt(0) == '#') { // Remove all the # chars in front of the real string
line = line.substring(1, line.length());
}
int i = 0;
while (line.charAt(i) == '#') {
i++;
}
line = line.substring(i);