c ++串行连接

时间:2018-03-01 08:24:14

标签: c++ wxwidgets

我的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发送的值包含在开始和停止符号中?还是有另一种我看不到的廉价方式?

1 个答案:

答案 0 :(得分:2)

作为一般规则,您无法准确读取您想要的长度&#34; (包括换行符等)使用串行通信时。字符可能会丢失,或者#34;噪音&#34;得到补充。

这是一种更好的方法来验证来自串行输入的数据,并使用更大的缓冲区读入单独的缓冲区,并返回行(或任何&#34;数据包&#34;您想要返回),当它们完成时,到调用代码。这当然会变得有点复杂,因为你需要第二个缓冲区来跟踪你尚未给予呼叫者的内容&#34;。

虽然,正如我的评论所暗示的,我认为这里的问题是你正在读取3个字节,并且你会收到5个字节。您的实际消息如下所示:

// To get top by text
Pageable pageable = new PageRequest(0, 10, Sort.Direction.ASC, "text");
// Top by title
Pageable pageable = new PageRequest(0, 10, Sort.Direction.ASC, "title");
// Top by publicationDate
Pageable pageable = new PageRequest(0, 10, Sort.Direction.ASC, "publicationDate");

首次,您阅读100<CR><LF> 101<CR><LF> 102<CR><LF> 103<CR><LF> ,然后第二次阅读获取100,然后<CR><LF>1,接下来获取01<CR>,然后<LF>10,我们再次与2<CR><LF>同步。

103是字符13(Control-M),<CR>是字符10(Control-J)