开发平台: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;         //计数清零 方便下次接收}}

如上代码段所示。这样可以实现接收不定长数据并处理,这样做的好处就是不用每次都判断是否收到帧头或者帧尾,而是集中起来一次处理之。

处理串口接收不定长数据的另一种解决方法相关推荐

  1. openmv串口数据 串口助手_STM32 串口接收不定长数据 STM32 USART空闲检测中断

    编者注: 单片机串口接收不定长数据时,必须面对的一个问题为:怎么判断这一包数据接收完成了呢?常见的方法主要有以下两种: 1.在接收数据时启动一个定时器,在指定时间间隔内没有接收到新数据,认为数据接收完 ...

  2. ZYNQ进阶之路14--PS端uart串口接收不定长数据

    ZYNQ进阶之路14--PS端uart串口接收不定长数据 导语 ZYNQ串口简介 实现步骤 导语 繁忙的博主又来了,本节我们实现一个比较简单的东西:串口.之前的章节中我们也有使用PS端的串口进行收发数 ...

  3. STM32串口接收不定长数据原理与源程序

    **STM32串口接收不定长数据原理与源程序**CSDN上有很多关于STM32串口接收不定长数据的文章,但实际使用后发现照搬他们的代码,程序根本就不能正确接收数据,其中最关键的一句有问题.其余内容完全 ...

  4. HAL库的串口基础学习(包含串口接收不定长数据的实现)

    HAL库的串口基础学习(1) HAL库有一个特点就是对于许多外设的初始化以及功能操作,都提供有一个weak版本的函数,这是充分的展现出库名字的含义(Hardware Abstraction Layer ...

  5. HAL库实践记录之串口接收不定长数据

    串口1接收不定长数据 实验板是原子mini板 一开始使用官方库,只能接受定长数据.把数据长度设置为1时,发送多字节数据时又会丢数.所以自己重写串口中断处理函数. 首先搞一下Cube配置用法:Mode选 ...

  6. 串口接收不定长数据的几种方式

    在阅读本文前,你需要先做到串口成功接收一个数据(相信这一点是很简单的)  这几天简单总结了一下用串口怎么接收一帧数据的办法,个人使用的有三种,下面逐一介绍: 第一种:使用中断的方式: 这种在数据接收不 ...

  7. stm32串口接收不定长数据_基于STM32之UART串口通信协议--接收

    一.前言 1.简介 回顾上一篇UART发送当中,已经讲解了如何实现UART的发送操作了,接下来这一篇将会继续讲解如何实现UART的接收操作. 2.UART简介 嵌入式开发中,UART串口通信协议是我们 ...

  8. STM32使用串口IDLE中断的两种接收不定长数据的方式

    现在有很多数据处理都要用到不定长数据,而单片机串口的RXNE中断一次只能接收一个字节的数据,没有缓冲区,无法接收一帧多个数据,现提供两种利用串口IDLE空闲中断的方式接收一帧数据,方法如下: 方法1: ...

  9. 串口IDLE空闲中断+DMA实现接收不定长数据基于stm32cubemx

    引言:对于串口接收一些不定长的数据,必须面对一个问题:怎么判断一帧数据接收是否完成?通常使用RXNE非空中断配合简单的数据协议,在数据中加入帧头.帧尾,在程序中判断是否接收到帧尾来确定数据接收完毕,因 ...

最新文章

  1. TCP/IP、 IPX/SPX、 NetBEUI、 AppleTalk协议
  2. 每日一皮:晕,程序重新请求一下,结果还不一样了!
  3. 学习笔记Hadoop(一)—— Hadoop介绍(1)——认识大数据
  4. NIPS 2018论文解读 | 基于条件对抗网络的领域自适应方法
  5. 【白话科普】聊聊 DNS 的那些小知识
  6. 阿里云欧洲数据中心开放运营:与沃达丰达成战略合作
  7. python二维数组操作_Python二维数组应用与操作
  8. android居中不父布局,在父级中,TextView不会垂直居中_android_开发99编程知识库
  9. Visual Studio 2013 编译Notepad++源码
  10. 计算机插本2a院校,广东省专插本2A院校有哪些
  11. Unity 日志管理系统
  12. mysql省市区数据导入_最新行政区划省市区镇街道 导入数据库 MYSQL (2020年8月 )
  13. ffdshow 源代码分析 8: 视频解码器类(TvideoCodecDec)
  14. Android一步步实现无痕埋点(3)-------虎躯一震
  15. 墨天轮沙龙 | 麦杰科技卢学东:openPlant 实时数据库系统及应用
  16. 计算机英语教学设计反思,小学五年级英语教学设计与反思
  17. 80端口和8080端口
  18. mac BigSur修改系统文件方法
  19. 高等教育心理学:知识的学习
  20. 数学课本五大奇人【zhuan】

热门文章

  1. 达美乐中国再闯港交所,能否IPO必达?
  2. 某盾blackBox逆向——纯算
  3. 计算机图形学场景设计论文,三维场景设计与表现--毕业设计(论文).doc
  4. 解决 conda 环境中调用 python 失败的问题
  5. C#四种布局方式(网格、泊靠式面板、栈式面板、自动折行式)
  6. MYSQL通过索引进行优化
  7. 人生最艰难的日子,你是怎么度过的
  8. 【转载】MTK Sensor 传感器驱动及系统框架 1. 【非常好】【mtk sensor 驱动框架】hwmsen_dev.c
  9. word-wrap同word-break的区别
  10. [附源码]java毕业设计基于的花店后台管理系统