Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 试图通过串行扫描仪读取数据不';我看不清整行_Java_Java.util.scanner - Fatal编程技术网

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);