【代码分享】基于乐鑫ESP32的串口不定长数据接收方法

描述

 

数据包串口不定长数据包

1、背景

为什么要实现串口不定长数据包的接收?

在使用串口进行数据接时,有时候我们并不知道对方的串口数据协议格式,于是没办法按照协议进行解析,也就无法提取完整的数据包出来,而应用层则需要完整的数据包进行处理,就迫使我们需要实现一种不定长数据包提取的实现方式;

举个例子,如果我们串口对接的是设备的串口的日志,由于日志并不是固定长度的,那么我们如何来提取一行日志呢(通过判断换行符是一种方法)?如果对方的日志是不可见字符呢?

通过实现串口不定长数据包的接收,可以提高系统的灵活性和适应性,使其能够更好地应对不同的数据传输需求。

一句话: 本文实现了esp32串口不定长数据接收方法,当接收数据超过512个字节自动按512个字节自动打包,如果不足512个字节,则通过两个数据的时间间隔差自动拆分包;

不想听我啰嗦,公众号后台私信: 代码分享 即可获取完整工程;

2、实现

在STM32平台有一个串口空闲的标志位,我们通过判断串口的空闲标志位来实现,但是如果使用ESP32,则很遗憾,我并没有见到有此标志位可以使用,那么本文将通过软件方式来实现串口不定长数据的接收实现;

2.1、实现平台

idf版本: esp-idf-v5.2.0

硬件: esp32-c3

2.2、实现的逻辑

在串口接收到数据时,启动串口数据监听和串口数据包处理两个线程;

监听线程监听到数据:判断接收到的数据长度是否大于512个字节,如果是则把512个字节打包为一个数据包,如果数据不足512个字节,则先缓存起来,然后记录此时的时间为T1;

如果打包之后还有数据,则继续运行第1步,如果剩余的数据不足512个字节,则先缓存起来,然后记录此时的时间T1;

定时器周期检测T1与当前时间的差值,如果差值大于100ms,则把剩余的数据打包为一个数据包;

如果还有新的数据监测到,则重新开始第1步;

串口数据包处理现场监听到有数据包处理则进行处理;

2.3、逻辑流程图

数据包串口不定长流程图

3实现效果测试数据

3.1、 数据小于512个字节

串口输入(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
 

  • 代码识别:达到预期效果(按512个字节打包,不足的按间隔打包)

3.2、数据等于于512个字节

  • 串口输入(512个字节):"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
 

3.3、数据大于512个字节

串口输入(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
 

温馨提示: 公众号后台私信发送: 代码分享 即可获取完整工程;

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分