C 读取串行端口上的数据-逐字节

C 读取串行端口上的数据-逐字节,c,serial-port,uart,C,Serial Port,Uart,如何以逐字节的方式读取串行端口上的数据 我有一个发送不同大小数据包的源。我正在以原始模式(非规范)读取数据。当我设置VMIN时,我可以得到那个大小或稍大一点的数据包。 例如:如果收到的数据包大小为46字节,并且如果我将VMIN设置为“1”。我以2个块的形式接收数据(这意味着需要2个读取调用才能获得完整的数据,其中一个读取前32个字节,下一个读取其余14个字节)。 若我将VMIN设置为46,则获取完整的数据包 但是这里的问题是不同的数据包大小。如果数据包的大小更大(比如70个字节),它将在第一次读

如何以逐字节的方式读取串行端口上的数据

我有一个发送不同大小数据包的源。我正在以原始模式(非规范)读取数据。当我设置VMIN时,我可以得到那个大小或稍大一点的数据包。 例如:如果收到的数据包大小为46字节,并且如果我将VMIN设置为“1”。我以2个块的形式接收数据(这意味着需要2个读取调用才能获得完整的数据,其中一个读取前32个字节,下一个读取其余14个字节)。 若我将VMIN设置为46,则获取完整的数据包

但是这里的问题是不同的数据包大小。如果数据包的大小更大(比如70个字节),它将在第一次读取时读取60多个字节,而在下一次读取时读取其余字节,从而弄乱缓冲区和后续读取

所以我想逐字节读取数据,并确定数据包的结尾

有人知道这是否可行吗。或者关于如何在一次读取操作中读取完整数据包的任何建议

UART设置: 波特率:115200 没有平价。 1停止位。 8N1。 没有流量控制


提前感谢。

处理串行数据的一个好方法是从端口将数据块读入缓冲区,然后从缓冲区逐字节提取数据

串口读取受超时设置和传入数据流的影响,因此不能保证每次读取的字节数一致。例如,如果您知道数据包总是46字节,那么您可能会考虑将Vmin设置为46,并期望每次读取46字节。但是,如果发送源发送多个数据包时没有延迟,那么您可能会得到一个数据包的全部和另一个数据包的一部分。如果发送源在数据包传输过程中的延迟时间超过接收端口的超时时间,则得到的字节数将少于Vmin


确保对可能丢失的数据进行编码。例如,假设数据包以开头,以结尾。您开始从缓冲区中提取数据,第一个字节是,但49个字节之后,您会遇到一个新的数据包,但没有看到来自前一个数据包的数据。当然,数据包也应该有一个CRC,或者至少有一个校验和。

处理串行数据的一个好方法是将数据块从端口读入缓冲区,然后逐字节从缓冲区中取出

串口读取受超时设置和传入数据流的影响,因此不能保证每次读取的字节数一致。例如,如果您知道数据包总是46字节,那么您可能会考虑将Vmin设置为46,并期望每次读取46字节。但是,如果发送源发送多个数据包时没有延迟,那么您可能会得到一个数据包的全部和另一个数据包的一部分。如果发送源在数据包传输过程中的延迟时间超过接收端口的超时时间,则得到的字节数将少于Vmin


确保对可能丢失的数据进行编码。例如,假设数据包以开头,以结尾。您开始从缓冲区中提取数据,第一个字节是,但49个字节之后,您会遇到一个新的数据包,但没有看到来自前一个数据包的数据。当然,数据包也应该有一个CRC,或者至少有一个校验和。

因为您正在读取结构为可变大小数据包的数据,您应该为每个数据包添加一个2字节的报头,并将其设置为数据包大小


在读卡器中,您将首先读取2个字节,然后决定要读取多少字节才能接收整个数据包。

由于您正在读取的数据结构为可变大小的数据包,您应该为每个数据包添加一个2字节的头,并将其设置为数据包大小


在读卡器中,您将首先读取2个字节,然后决定要读取多少字节才能接收整个数据包。

'因此,我想逐字节读取数据,并确定数据包的结尾。'当然,这当然是一个应该工作的协议,假设您有一个明确的数据包结束标记字节,我在这里发现了一些有趣的设置。请参阅“因此我正在考虑逐字节读取数据并确定数据包的结尾”当然,这当然是一个应该工作的协议,假设您有一个明确的数据包结尾标记字节。我在这里发现了一些有趣的设置。看见