我们从2011年坚守至今,只想做纯粹的技术论坛,请不要发布和技术无关的话题。  本站有两万多份高大上的PCB和原理图下载,每日更新中,欢迎常回来看看

 找回密码
 立即注册
搜索
查看: 1964|回复: 6

[技术文章] 处理串口接收不定长数据的一种解决方法

[复制链接]

34

主题

16

回帖

103

积分

二级逆天

积分
103

社区居民终身成就奖

QQ
发表于 2020-1-11 22:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
开发平台:Keil 5
库函数版本:V3.5
芯片:STM32F103CBT6

之前我在我的另一篇博客中介绍过使用串口空闲中断+DMA的方式来处理不定长数据,没有看过的同学可以点击这里查看。今天要介绍另一种接收不定长数据的方法。

使用的是接收中断和和空闲中断结合的方式。大概思路是:我们在串口配置的时候先只开串口接收完成中断,然后在接收中断中再开启空闲中断,当空闲中断发生时,表明本次数据接收完成,再次关闭空闲中断,然后把数据送到处理函数中处理。

这种方式的好处是,在接收完成中断中,我们只需要把数据放在缓冲区中即可,不需要再对数据做判断来确定本次数据是否接收完成,这块可以节约MCU资源,实现起来也比较简单。具体的串口配置我就不做详细介绍,和普通的串口配置没什么不同,主要是要在接收中断中打开空闲中断,然后在空闲中断中关闭空闲中断以接收下一帧数据,最后再做一个数据处理。

我们直接放中断处理函数来分析一下:

//陀螺仪通讯串口
#define GYRO_UART USART2

//串口2中断服务程序
void USART2_IRQHandler(void)                    
{   
    static uint16_t uart_recv_count = 0 ; //接收计数
    unsigned int data;    //接收缓冲
    if(GYRO_UART->SR & 0x0F)
    {
        data = GYRO_UART->DR;
    }        
    else if(GYRO_UART->SR & USART_FLAG_RXNE)  
    {        
        data = GYRO_UART->DR;
        sensor_data_buffer[uart_recv_count++] =data;//(USART1->DR);    //读取接收到的数据
         if(uart_recv_count==1)
         {
               USART_ITConfig(GYRO_UART, USART_IT_IDLE, ENABLE); //使能空闲中断
         }
                                
    }   
    else if(GYRO_UART->SR & USART_FLAG_IDLE){
        data=GYRO_UART->SR;
        data=GYRO_UART->DR;               //清串口故障
        USART_ITConfig(GYRO_UART, USART_IT_IDLE, DISABLE);   //关空闲中断 等待下次接收
        gyro_data_process(sensor_data_buffer, uart_recv_count);   //数据处理
        memset(sensor_data_buffer, 0, uart_recv_count);   //清掉数据 方便下次接收
        uart_recv_count = 0;            //计数清零 方便下次接收
    }
   
}
如上代码段所示。这样可以实现接收不定长数据并处理,这样做的好处就是不用每次都判断是否收到帧头或者帧尾,而是集中起来一次处理之。
  • 打卡等级:常住青年
  • 打卡总天数:17
  • 打卡月天数:0
  • 打卡总奖励:61
  • 最近打卡:2025-01-13 19:11:02

0

主题

8150

回帖

7628

积分

二级逆天

积分
7628

终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

QQ
发表于 2020-1-11 22:48 | 显示全部楼层
回复

使用道具 举报

  • 打卡等级:初入少年
  • 打卡总天数:1
  • 打卡月天数:0
  • 打卡总奖励:3
  • 最近打卡:2024-08-07 10:43:46

0

主题

3294

回帖

2967

积分

二级逆天

积分
2967

终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

QQ
发表于 2020-1-12 10:12 | 显示全部楼层
回复

使用道具 举报

  • 打卡等级:以坛为家III
  • 打卡总天数:400
  • 打卡月天数:0
  • 打卡总奖励:1334
  • 最近打卡:2025-11-20 23:18:22

69

主题

7758

回帖

1万

积分

三级逆天

积分
11327

社区居民社区劳模原创先锋奖终身成就奖特殊贡献奖优秀斑竹奖

QQ
发表于 2020-1-12 11:15 | 显示全部楼层
回复

使用道具 举报

12

主题

5132

回帖

5082

积分

二级逆天

积分
5082

终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

QQ
发表于 2020-1-12 17:45 | 显示全部楼层
回复

使用道具 举报

  • 打卡等级:常住青年
  • 打卡总天数:17
  • 打卡月天数:0
  • 打卡总奖励:61
  • 最近打卡:2025-01-13 19:11:02

0

主题

8150

回帖

7628

积分

二级逆天

积分
7628

终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

QQ
发表于 2020-1-12 18:39 | 显示全部楼层
回复

使用道具 举报

  • 打卡等级:初入少年
  • 打卡总天数:2
  • 打卡月天数:0
  • 打卡总奖励:8
  • 最近打卡:2025-10-09 14:04:48

8

主题

1634

回帖

2275

积分

二级逆天

积分
2275

社区居民终身成就奖

QQ
发表于 2020-3-4 18:10 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请举报投诉

本站所有资料仅限参考学习交流,PCB原理图源码等所有资料不保证准确没问题,请不要用作生产。否则后果自负。

闽公网安备35062302000276号 | 闽ICP备2024076463号-1 | 论坛技术支持QQ群171867948 | 论坛问题,充值问题请联系QQ1308068381

平平安安
TOP
快速回复 返回顶部 返回列表