【自学嵌入式:stm32单片机】USART串口数据包

USART串口数据包

HEX数据包

此处以FF为包头,FE为包尾
image

数据和包头包尾冲突的办法

  1. 限制载荷数据的范围,如果可以,在发送的时候对数据进行限幅,比如XYZ,3个数据,变化范围都可以是0~ 100,我们在载荷中只发送0~ 100的数据,这样可以避免数据和包头包尾重复;
  2. 如果无法避免载荷数据和包头包尾重复,那就使用固定长度的数据包,这样载荷数据是固定的,只要我们通过包头包尾对齐了数据,我们就可以严格地知道哪个数据应是包头包尾,哪个数据应该是载荷数据,在接收载荷数据的时候,会判断是否是包头包尾,而在接收包头包尾的时候,我们会判断它是不是确实是包头包尾,用于数据对齐,这样,在经过几个数据包的对齐之后,剩下的数据包应该就不会出现问题了;
  3. 增加包头包尾的数量,并且让它尽量呈现出载荷数据出现不了的状态,比如我们使用FF、FE作为包头,FD、FC作为包尾,这样也可以避免载荷数据和包头包尾重复的情况发生。

无法避免载荷数据和包头包尾重复的问题

这个包头包尾并不是全部都需要,比如我们可以只要一个包头,把包尾删掉,这样数据包的格式就是,一个包头FF,加4个数据,这样也是可以的,当检测到FF,开始接收,收够4个字节后,置标志位,一个数据包接收完成,不过这样的话,载荷和包头重复的问题会更严重一些,比如最严重的情况下,我载荷全是FF,包头也是FF,那你肯定不知道哪个是包头了,而加上了FE作为包尾,无论数据怎么变化,都是可以分辨出包头包尾的。

固定包长和可变包长的选择问题

对应HEX数据包来说,如果你的载荷会出现和包头包尾重复的情况,那就最好选择固定包长,这样可以避免接收错误,如果你的载荷既会出现和包头包尾重复,又选择可变包长,那数据很容易就乱套了,如果载荷不会和包头包尾重复,那可以选择可变包长,数据长度任意变化,因为包头包尾是唯一的,只要出现包头,就开始数据包,只要出现包尾就结束数据包。

各种数据转换为字节流的问题

这里数据包都是一个字节一个字节组成的,如果你想发送16位的整型数据、32位的整型数据,float、double,甚至是结构体,其实都没问题,因为它们内部其实都是由一个字节一个字节组成的,只需要用一个uint8_t的指针指向它,把它们当作一个字节数组发送就行了。

文本数据包

以字符@做包头,以两个字符\r\n做包尾
image

HEX数据包接收

image
在程序中,我们需要设计一个能记住不同状态的机制,在不同状态执行不同的操作,同时还要进行状态的合理转移,这种程序设计思维,就叫做“状态机”,在这里我们就使用状态机的方法来接收一个数据包.

文本数据包接收

image

posted @ 2025-08-20 09:50  秦瑞迁  阅读(23)  评论(0)    收藏  举报