如何以字节方式读取串行端口上的数据。
我有一个发送不同数据包大小的数据包的源。我正在以原始模式(非规范)读取数据。当我设置VMIN时,我能够获得该大小或稍大的数据包。 例如:如果收到的数据包大小是46字节,并且我将VMIN设置为说' 1'。我收到2个数据块的数据(意味着需要2个读取调用才能获得完整的数据,其中一个取出前32个,然后取出其余的14个字节)。 如果我将VMIN设置为46,则获取完整的数据包。
但问题是改变数据包大小。如果数据包的大小更多(例如70个字节),它将使缓冲区和后续读取混乱,因为它在第一次读取时读取60多个字节,在下次读取时休息。
所以我想逐字节读取数据并确定数据包的结束。
有谁知道它是否可行。或者有关如何在一次读操作中读取完整数据包的任何建议。
UART设置: 波特:115200 没有平价。 1站点。 8N1。 没有流量控制。
提前致谢。
答案 0 :(得分:0)
处理串行数据的一个好方法是从端口读取数据块到缓冲区,然后从缓冲区逐字节地拉。
串行端口读取受超时设置和传入数据流的影响,因此每次读取的字节数不保证一致。例如,如果您知道数据包始终是46个字节,那么您可能会认为将Vmin设置为46并且期望每次读取获得46个字节。但是,如果发送源发送多个数据包之间没有延迟,那么您可能会得到所有其中一个数据包的一部分。如果发送源在数据包传输过程中延迟的时间超过接收端口的超时时间,那么你将获得少于Vmin的字节。
请务必编码丢失数据的可能性。例如,假设数据包以字符串开头和结尾。你开始从缓冲区中提取数据并且第一个字节是,但49个字节后你会遇到一个新的数据包,但没有看到前一个数据包。当然也应该有数据包的CRC,或者至少是校验和。
答案 1 :(得分:0)
由于您正在读取结构化为大小可变的数据包的数据,因此应为每个数据包添加一个2字节的标头并将其设置为数据包大小。
在读取器中,您将首先读取2个字节,然后决定读取多少个字节以接收整个数据包。