2025世俱杯

单片机串口接收的几种常用的数据处理方法

出处:网络整理 发布于:2025-05-23 16:26:54

在通信中,接收数据的处理是关键环节,常用的数据处理方法有以下几种,可根据具体场景选择或组合使用:


1. 轮询检测法

  • 原理:在主循环中不断检查串口接收标志位(如UART_RX_FLAG)或缓冲区状态。

  • 特点:

    • 实现简单,占用资源少。

    • 实时性差,可能丢失高速数据。

  • 示例代码:

    while (1) {
        if (UART_DataAvailable()) {
            char data = UART_ReadByte();
            // 处理数据
        } }

2. 中断接收法

  • 原理:通过硬件中断触发接收,每收到一个字节即进入中断服务程序(ISR)。

  • 特点:

    • 实时性高,适合高速数据。

    • 需避免在ISR中执行耗时操作。

  • 示例代码:

    void UART_ISR() {
        if (RX_INTERRUPT_FLAG) {
            static uint8_t buffer[64];
            static int index = 0;
            buffer[index++] = UART_RX_REG;
            if (index >= 64) index = 0; // 防止溢出
        } }

3. 环形缓冲区(FIFO)

  • 原理:在中断中接收数据并存入环形缓冲区,主程序从缓冲区读取处理。

  • 优势:

    • 解决数据覆盖问题,平衡中断与主程序的速率差异。

    • 适合数据流不稳定的场景。

  • 实现要点:

    • 定义头尾指针(或索引)。

    • 注意缓冲区满/空的判断条件(通常留一字节空位)。

  • 示例结构:

    #define BUF_SIZE 128 typedef struct {
        uint8_t buffer[BUF_SIZE];
        volatile uint16_t head; // 写入位置
        volatile uint16_t tail; // 读取位置 } RingBuffer;

    4. 协议帧解析法

  • 原理:通过自定义协议(如头尾标志、长度、校验等)提取有效数据帧。

  • 常见协议:

    • 固定长度帧:如每帧5字节,直接按长度截取。

    • 可变长度帧:通过帧头(如0xAA)、长度字段、校验(如CRC)组合。

    • 特殊结束符:如以\r\n结尾的字符串(AT指令常用)。

  • 示例处理流程:

    1. 搜索帧头(如0xAA)。

    2. 读取长度字段。

    3. 校验数据完整性(和校验、CRC等)。

    4. 解析有效载荷。

    5. DMA接收+空闲中断

  • 原理:利用DMA自动搬运串口数据到,配合串口空闲中断(IDLE)判定一帧结束。

  • 优势:

    • 极大降低CPU负载,适合高速大数据量(如GPS模块、Modbus)。

    • 空闲中断可识别帧间隔(如串口停顿时间)。

  • 示例(STM32 HAL库):

    // 启动DMA接收 HAL_UART_Receive_DMA(&huart1, buffer, MAX_LEN); // 空闲中断回调 void HAL_UART_IdleCallback(UART_HandleTypeDef *huart) {
        if (huart == &huart1) {
            uint32_t len = MAX_LEN - __HAL_DMA_GET_COUNTER(huart->hdmarx);
            process_frame(buffer, len); // 处理数据
            HAL_UART_Receive_DMA(huart, buffer, MAX_LEN); // 重启接收
        } }

    6. 状态机解析

  • 原理:根据接收进度切换状态(如等待头、读长度、读数据、校验等)。

  • 适用场景:复杂协议(如自定义工业协议、JSON片段)。

  • 示例状态机:

    typedef enum { STATE_HEADER, STATE_LEN, STATE_DATA, STATE_CRC } ParserState;
    ParserState state = STATE_HEADER; while (UART_DataAvailable()) {
        uint8_t byte = UART_ReadByte();
        switch (state) {
            case STATE_HEADER:
                if (byte == 0xAA) state = STATE_LEN;
                break;
            case STATE_LEN:
                data_len = byte;
                state = STATE_DATA;
                break;
            // ...其他状态处理
        } }

    7. 超时管理

  • 原理:结合判断帧接收超时,避免半帧残留。

  • 实现方式:

    • 在中断或轮询中重置超时计时器。

    • 超时后触发帧处理并清空缓冲区。

  • 示例:

    void TIM_ISR() {
        if (timeout_cnt > 0 && --timeout_cnt == 0) {
            process_frame(buffer, current_len); // 超时处理
            current_len = 0;
        } }

    选择建议

  • 低速简单场景:轮询/中断+环形缓冲区。

  • 高速稳定数据:DMA+空闲中断。

  • 复杂协议:状态机+超时管理。

  • 资源紧张:避免动态内存,使用静态缓冲区。

关键词:单片机

版权与免责声明

凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,//qvqwriy.cn,违反者本网将追究相关法律责任。

本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。

如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

OEM清单文件: OEM清单文件
*公司名:
*联系人:
*手机号码:
QQ:
有效期:

扫码下载APP,
一键连接广大的电子世界。 

在线人工客服

买家服务:
卖家服务:
技术客服:

0571-85317607

网站技术支持

13606545031

客服在线时间周一至周五
 9:00-17:30

关注官方微信号,
第一时间获取资讯。

建议反馈

联系人:

联系方式:

按住滑块,拖拽到最右边
>>
感谢您向阿库提出的宝贵意见,您的参与是维库提升服务的动力!意见一经采纳,将有感恩红包奉上哦!