尝试通过Serial with Scanner读取数据不会读取完整行

时间:2017-01-31 12:34:10

标签: java java.util.scanner

我正在开展一个项目,我在Arduino上获得感应数据,通过串行打印到我的笔记本电脑上。当我使用Arduino IDE时,串口监视器可以正常工作。 (完整消息如下所示:1-35 251 58 152)。 -之后的字符是UID,所以它们应该始终相同,因为我只使用一个设备进行测试。

当我尝试通过Java阅读时,我得到不同的消息(或者至少不是完整的消息)。

public void setupUSB() {
    SerialPort ports[] = SerialPort.getCommPorts();
    for (SerialPort port : ports) {
        if (port.getSystemPortName().equals("COM6")) myPort = port; // using LoRa over USB
    }
    myPort.setBaudRate(38400);
    myPort.openPort();
    myPort.setComPortTimeouts(SerialPort.TIMEOUT_SCANNER, 0, 0);
}

上述方法启动我正在使用的USB端口。 经过一些检查后,我尝试将端口读取为以下内容(删除了try catch和其他非重要代码)。

Scanner data = new Scanner(myPort.getInputStream()).useDelimiter("\n");
if (data.hasNext()) {
    String line = data.next();
    System.out.println("readUSB: " + line);
}

我也尝试了以下内容:

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和我的USB端口都在38400使用相同的baudRate。我觉得错误可能出现在下面的代码中,因为当我连接传感器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]
  }
}

1 个答案:

答案 0 :(得分:0)

我似乎无法摆脱这个问题,但我注意到以下情况。

如果我在Arduino的消息前面添加一个String,我会得到这样的结果:

  • readUSB:llo World:9-35 251 58 152(显然应该说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);

我接受这个答案,因为它适用于我的问题。但如果有人对这个问题有一个真正的(好)解决方案,请发布它,我会接受它。