Windows 串行:在接收到起始字节之前丢弃输入缓冲区中接收到的所有字节

Posted

技术标签:

【中文标题】Windows 串行:在接收到起始字节之前丢弃输入缓冲区中接收到的所有字节【英文标题】:Windows serial: discard all bytes received in the input buffer before a start bytes received 【发布时间】:2021-06-28 11:00:59 【问题描述】:

我正在做一个项目,我应该在我的 C++ 应用程序中解析传入的传感器数据。传感器数据由 Arduino 通过串行通信发送到 Windows。数据包含这样的字符串:

$12.345,12.345,12.345,12.345*(+ 换行和回车)

传感器数据可以是 35-46 字节。这两者之间的串口是使用 CreateFile Windows 函数建立的,并配置为同步的,如下所示:

波特率:38400

字节大小:8

奇偶校验:无

停止位:1

我试图在 Arduino IDE 和 hterm 上查看传入的数据。数据以应有的方式正确出现。但是,我的应用程序收到“不规则”的数据。就像有时,ReadFile 函数从字符串中间读取 + 连接的下一个字符串:

12.345*\n\r$67.890,67.890,67.890,67.890*

因此,我想问是否可以将 Windows 串行设置为丢弃在“$”符号到达之前进入输入缓冲区的任何字符?

【问题讨论】:

【参考方案1】:

串口通信基本上是基于字符的通信,而不是像 TCP/IP 这样的基于数据包的定界通信。

接收端读取发送端写入一次的数据并不总是可能的,有可能一次读取可以同时接收到多个写入的数据。

你必须明白这一点,把所有接收到的数据都当作有效数据,分析它,并为每个分隔符单元剪掉它。

未到达分隔符单元的数据必须与稍后接收的数据连接,并且必须在分析之前接收足够长度的数据。

如果碎片数据被丢弃,则无法进行正确的通信。

请仅丢弃分析结果中看似噪音或无效的数据。

【讨论】:

感谢您的解释!现在很清楚这是一个“正常”的事件,因此我需要相应地处理传入的数据。

以上是关于Windows 串行:在接收到起始字节之前丢弃输入缓冲区中接收到的所有字节的主要内容,如果未能解决你的问题,请参考以下文章

基于RS422通信的FPGA软件设计第四天

基于RS422通信的FPGA软件设计第二天

C#Serialport.DiscardInBuffer,DiscardOutBuffer的具体作用

HAL_SPI_Transmit() 会丢弃接收到的数据吗?

路由器串行接口互联地址可以不在同一个网段

需要帮助了解发送字节到串行端口