串口不定长数据包
为什么要实现串口不定长数据包的接收?
在使用串口进行数据接时,有时候我们并不知道对方的串口数据协议格式,于是没办法按照协议进行解析,也就无法提取完整的数据包出来,而应用层则需要完整的数据包进行处理,就迫使我们需要实现一种不定长数据包提取的实现方式;
举个例子,如果我们串口对接的是设备的串口的日志,由于日志并不是固定长度的,那么我们如何来提取一行日志呢(通过判断换行符是一种方法)?如果对方的日志是不可见字符呢?
通过实现串口不定长数据包的接收,可以提高系统的灵活性和适应性,使其能够更好地应对不同的数据传输需求。
一句话: 本文实现了esp32串口不定长数据接收方法,当接收数据超过512个字节自动按512个字节自动打包,如果不足512个字节,则通过两个数据的时间间隔差自动拆分包;
不想听我啰嗦,公众号后台私信: 代码分享 即可获取完整工程;
在STM32平台有一个串口空闲的标志位,我们通过判断串口的空闲标志位来实现,但是如果使用ESP32,则很遗憾,我并没有见到有此标志位可以使用,那么本文将通过软件方式来实现串口不定长数据的接收实现;
idf版本: esp-idf-v5.2.0
硬件: esp32-c3
在串口接收到数据时,启动串口数据监听和串口数据包处理两个线程;
监听线程监听到数据:判断接收到的数据长度是否大于512个字节,如果是则把512个字节打包为一个数据包,如果数据不足512个字节,则先缓存起来,然后记录此时的时间为T1;
如果打包之后还有数据,则继续运行第1步,如果剩余的数据不足512个字节,则先缓存起来,然后记录此时的时间T1;
定时器周期检测T1与当前时间的差值,如果差值大于100ms,则把剩余的数据打包为一个数据包;
如果还有新的数据监测到,则重新开始第1步;
串口数据包处理现场监听到有数据包处理则进行处理;
串口不定长流程图
串口输入(20个字节):"30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30"
代码识别:达到预期效果
uart_rx_ap |229 |[uart]*********************** 0020 **********************
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
串口输入(20个字节):"30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30"(150ms周期发送)
代码识别(自动拆分为多次多个数据包,每个数据包还是21个字节):达到预期效果
uart_rx_ap |229 |[uart]*********************** 0020 **********************
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]*********************** 0020 **********************
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]*********************** 0020 **********************
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
串口输入(20个字节):"30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30"(15ms周期发送)
uart_rx_ap |229 |[uart]*********************** 0512 **********************
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]*********************** 0176 **********************
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]*********************** 0512 **********************
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30
串口输入(565个字节):"30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 ... ... 30"
代码识别:达到预期效果
uart_rx_ap |229 |[uart]*********************** 0512 **********************
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]*********************** 0053 **********************
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
uart_rx_ap |229 |[uart]30 30 30 30 30 30 30 30 30 30 30 30 30
温馨提示: 公众号后台私信发送: 代码分享 即可获取完整工程;
全部0条评论
快来发表一下你的评论吧 !