我正在开展一个项目,我在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]
}
}
答案 0 :(得分:0)
我似乎无法摆脱这个问题,但我注意到以下情况。
如果我在Arduino的消息前面添加一个String,我会得到这样的结果:
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);
我接受这个答案,因为它适用于我的问题。但如果有人对这个问题有一个真正的(好)解决方案,请发布它,我会接受它。