0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

机智云 2024-11-15 01:02 次阅读

4744694a-a2aa-11ef-8084-92fbcf53809c.png串口不定长数据包

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、逻辑流程图

47712836-a2aa-11ef-8084-92fbcf53809c.png串口不定长流程图

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]3030303030303030303030303030303030303030

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

uart_rx_ap|229|[uart]***********************0020**********************
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030

uart_rx_ap|229|[uart]***********************0020**********************
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030

串口输入(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]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]303030303030303030303030

uart_rx_ap|229|[uart]***********************0176**********************
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]30303030303030303030303030303030

  • 代码识别:达到预期效果(按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]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]303030303030303030303030

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]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]303030303030303030303030

uart_rx_ap|229|[uart]***********************0053**********************
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]30303030303030303030303030

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

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

    关注

    14

    文章

    1550

    浏览量

    76400
  • 数据包
    +关注

    关注

    0

    文章

    260

    浏览量

    24384
  • 数据接收
    +关注

    关注

    0

    文章

    12

    浏览量

    7811
  • ESP32
    +关注

    关注

    18

    文章

    968

    浏览量

    17194
收藏 人收藏

    评论

    相关推荐

    不定长数据接收的原理是什么?怎么实现串口数据不定长接收

    不定长数据接收的原理是什么?怎么实现串口数据不定长接收
    发表于 11-16 08:11

    STM32串口接收不定长数据的实现方法

    STM32串口接收不定长数据的实现方法
    发表于 12-09 06:17

    基于DMA接收利用空闲模式接收不定长数据

    的利用空闲模式接收不定长数据方法,都是基于DMA接收的,个人项目因为有低功耗需要,平时是在停机模式,在唤醒后才能
    发表于 01-12 07:44

    HAL库下串口接收不定长数据方法

    STM32单片机HAL库下串口接收不定长数据HAL库下的串口接收
    发表于 01-19 06:55

    了解在MCU中实现串口不定长数据接收的过程

    在MCU的应用中,经常需要通过串口进行不定长数据包的传输。发送方很简单,不需特别的考虑,而接收方则需要能够侦测到数据包的结束。
    的头像 发表于 08-03 16:37 7246次阅读
    了解在MCU中实现<b class='flag-5'>串口</b>的<b class='flag-5'>不定长</b><b class='flag-5'>数据</b>包<b class='flag-5'>接收</b>的过程

    stm32 串口接收不定长度数据及黏包处理 + 串口DMA接收

    1.不定长度数据 为什么会存在串口接收不定长度数据呢?首先,在通信双方进行数据传输的时候,由于不同的设备在实现控制,
    发表于 12-23 19:09 27次下载
    stm32 <b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定长度数据</b>及黏包处理 + <b class='flag-5'>串口</b>DMA<b class='flag-5'>接收</b>

    STM32 DMA串口接收不定长数据

    STM32 DMA串口接收不定长数据
    发表于 12-24 18:50 40次下载
    STM32  DMA<b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定长</b><b class='flag-5'>数据</b>

    STM32之串口DMA接收不定长数据

    目录STM32之串口DMA接收不定长数据引言DMA简介什么是DMA在STM32的DMA资源DMA接收数据
    发表于 12-24 19:03 30次下载
    STM32之<b class='flag-5'>串口</b>DMA<b class='flag-5'>接收</b><b class='flag-5'>不定长</b><b class='flag-5'>数据</b>

    esp32-c2开发演示

    esp32-c2开发演示
    的头像 发表于 11-17 15:39 2231次阅读
    <b class='flag-5'>乐</b><b class='flag-5'>鑫</b><b class='flag-5'>esp32</b>-c2开发演示

    STM32CubeMX之串口接收不定长数据

    基本串口通信通常只能接收定长数据,无法稳定接收不定长数据
    的头像 发表于 05-11 09:59 3357次阅读
    STM32CubeMX之<b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定长</b><b class='flag-5'>数据</b>

    【笔记】接收不定长串口数据的方式(附代码)

    不定长串口数据接收方面,有多种方式可供选择。以下是几种常见的方法:1.基于帧头帧尾:通过在数据帧的开头和结尾添加特定的帧头和帧尾标识来确定
    的头像 发表于 06-07 10:00 3122次阅读
    【笔记】<b class='flag-5'>接收</b><b class='flag-5'>不定长串口</b><b class='flag-5'>数据</b>的方式(附<b class='flag-5'>代码</b>)

    ESP32-DevKitS-V1.1参考设计

    ESP32-DevKitS-V1.1参考设计多年来深耕?AIoT?领域软硬件产品的研发与设计,专注于研发高集成、低功耗、性能卓越、安
    发表于 10-19 16:13 2次下载

    ESP32-WROOM-32UE参考设计

    ESP32-WROOM-32UE参考设计ESP32将天线开关、RFbalun、功率放大器、接收低噪声放大器、滤波器、电源管理模块等功能集
    发表于 10-19 16:13 14次下载

    ESP32-SenseKit参考设计

    ESP32-SenseKit参考设计ESP32将天线开关、RFbalun、功率放大器、接收低噪声放大器、滤波器、电源管理模块等功能集于一
    发表于 10-19 16:13 2次下载

    ESP32-MINI-1参考设计

    ESP32-MINI-1参考设计多年来深耕?AIoT?领域软硬件产品的研发与设计,专注于研发高集成、低功耗、性能卓越、安全稳定、高性
    发表于 10-19 16:13 13次下载