【发布时间】:2018-03-01 08:24:13
【问题描述】:
我的 arduino(这不是 Arduino 问题,而是一般 C++ 问题)连接到 PC 并每 2 秒发送一个计数的 3 位数字:
for (long i=100; i <= 999; i++){
Serial.println(i);
delay(2000);
}
通过终端程序连接到 com 端口表明代码执行了预期的操作。
在我的 C++ 应用程序(我们称之为客户端)中,我使用以下代码 - 在自己的线程中运行 - 从串行连接中获取数据:
void *MyThread::Entry() {
SerialPort arduino(port_name); // Init serial port
if (arduino.isConnected()){
wxLogMessage("Message: %s", "Connection Established");
}
else {
wxLogMessage("Message: %s", "ERROR, check port name");
}
while (arduino.isConnected()){
int read_result = arduino.readSerialPort(incomingData, MAX_DATA_LENGTH); // Read data
if (read_result > 2){ // Length of read data
wxLogMessage("incomingData: %s", incomingData);
}
}
}
但是,这会产生如下输出:
09:02:14: Message: Connection Established
09:02:14: incomingData: 100
09:02:15: incomingData:
1
09:02:17: incomingData: 01
09:02:18: incomingData:
10
09:02:20: incomingData: 2
09:02:21: incomingData: 103
09:02:23: incomingData:
1
09:02:24: incomingData: 04
09:02:26: incomingData:
10
09:02:27: incomingData: 5
09:02:29: incomingData: 106
09:02:30: incomingData:
1
09:02:32: incomingData: 07
09:02:33: incomingData:
10
09:02:35: incomingData: 8
09:02:36: incomingData: 109
09:02:38: incomingData:
1
所以我总是在两个正确的行之间有 4 行错误的值。我认为这是一个赛车问题。 C++ 代码轮询串行连接方式高于 arduino 发送数据(每 2 秒)。
incomingData 是
char incomingData[255];
我不能只清空incomingData 并测试3 位数字。
那么我怎样才能让客户以正确的方式获得 arduino 发送的每一个完整的 3 位数值呢?我是否需要实现自己的消息传递系统,例如用开始和停止符号将 arduino 发送的值括起来?还是有其他我看不到的便宜方式?
【问题讨论】:
-
“MAX_DATA_LENGTH”是否被定义为 3?您可能需要考虑换行符。
-
如果 MAX_DATA_LENGTH 为 3 或 255 则不起作用。结果是一样的。但马茨在下面发现了问题。无论如何,感谢您的评论!
-
我很确定如果你将“MAX_DATA_LENGTH”设置为 5,你会得到你想要的输出,除非你有一个“坏线”。