【问题标题】:c++ serial connectionc++串口连接
【发布时间】: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,你会得到你想要的输出,除非你有一个“坏线”。

标签: c++ wxwidgets


【解决方案1】:

作为一般规则,在使用串行通信时,您不能“准确读取所需的长度”(包括换行符等)。有可能会丢失字符,或者添加“噪音”。

这是一种更好的方法来验证来自串行输入的数据,并使用更大的缓冲区读取到单独的缓冲区,并在完成后返回行(或您想要返回的任何“数据包”),到调用代码。这当然会变得更复杂一些,因为您需要第二个缓冲区来跟踪您“尚未提供给调用者”的内容。

尽管正如我的评论所暗示的那样,我认为这里的问题是您正在读取 3 个字节,而您收到 5 个字节。您的实际消息如下所示:

100<CR><LF>
101<CR><LF>
102<CR><LF>
103<CR><LF>

所以第一次,你读到100,然后第二次读到&lt;CR&gt;&lt;LF&gt;1,然后是01&lt;CR&gt;,下一次读到&lt;LF&gt;10,然后是2&lt;CR&gt;&lt;LF&gt;,我们又和103同步了再次。

&lt;CR&gt; 是字符 13 (Control-M),&lt;LF&gt; 是字符 10 (Control-J)

【讨论】:

  • 你完全正确!感谢您为我指明正确的方向!
猜你喜欢
  • 2014-12-25
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-09
  • 1970-01-01
相关资源
最近更新 更多