编者注:

单片机串口接收不定长数据时,必须面对的一个问题为:怎么判断这一包数据接收完成了呢?常见的方法主要有以下两种:

1.在接收数据时启动一个定时器,在指定时间间隔内没有接收到新数据,认为数据接收完成;2.在数据中加入帧头、帧尾,通过在程序中判断是否接收到帧尾来确定数据接收完毕。这两种方法的缺点为,需要主程序来判断和处理,对主程序造成不小压力。

STM32单片机空闲检测中断可以很好的解决这个问题。他的工作原理为:

当STM32的串口接收完一包数据后,会产生一个空闲中断。这个中断在串口其他任何状态都不产生,只会在接收完一包数据后才会产生,一包数据可以是1个字节或者多个字节。因此,我们可以在这个空闲中断函数中,设置一个接收完成标志位。那么,我们只需要在主程序中检测这个标志位就知道数据是否接收完成了。具体应该怎么操作呢?其他不表,直接上代码:

上述代码几乎是STM32串口的常规配置,无需赘述。增加了第47行的空闲中断使能语句,允许它中断即可:

USART_ITConfig(DEBUG_USARTx, USART_IT_IDLE, ENABLE);//空闲中断使能

下面是主程序和串口中断函数:

先来看第30-36行的中断函数内容,首先是把接收到的字节存到rx_buff中,并且数据长度rx_cnt++,接着调用库函数清除接收中断标志位,属于常规的数据接收操作。

不同的是第38-46行:

判断是不是产生了串口空闲中断(USART_IT_IDLE),然后就是置位接收完成标志位rx_done = 1,并且清除空闲中断标志位。

注意事项:

调用库函数USART_ClearITPendingBit(DEBUG_USARTx, USART_IT_IDLE);是不会清除空闲中断标志位的。应该采用42-43两条语句实现,否则会一直进入中断函数。

temp = USART1->SR; //先读SR,再读DR才能完成idle中断的清零,否则一直进入中断。temp = USART1->DR;

第9-24行的主函数进行相应的处理便可。

openmv串口数据 串口助手_STM32 串口接收不定长数据 STM32 USART空闲检测中断相关推荐

  1. android 串口一直打开_STM32之串口DMA接收不定长数据

    STM32之串口DMA接收不定长数据 引言 在使用stm32或者其他单片机的时候,会经常使用到串口通讯,那么如何有效地接收数据呢?假如这段数据是不定长的有如何高效接收呢? 同学A:数据来了就会进入串口 ...

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

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

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

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

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

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

  5. stm32串口空闲中断接收不定长数据

    串口空闲中断接收不定长数据 空闲中断是接受数据后出现一个byte的高电平(空闲)状态,就会触发空闲中断.并不是空闲就会一直中断,准确的说应该是上升沿(停止位)后一个byte,如果一直是低电平是不会触发 ...

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

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

  7. STM32单片机串口空闲中断+DMA接收不定长数据

    在上一篇文章STM32单片机串口空闲中断接收不定长数据中介绍了利用串口空闲中断接收不定长数据,这种方式有一个问题就是串口每接收到一个字节就会进入一次中断,如果发送的数据比较频繁,那么串口中断就会不停打 ...

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

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

  9. STM32使用串口1配合DMA接收不定长数据,大大减轻CPU载荷

    摘自:http://www.openedv.com/thread-63849-1-1.html 参考:https://blog.csdn.net/heda3/article/details/80602 ...

最新文章

  1. IntelliJ IDEA 安装go插件
  2. 判断checkbox是否选中并改变值
  3. Chmod 提升一个文件夹下所有文件(夹)的权限
  4. 关于_WIN32_WINNT的含义
  5. /home/appleyuchi主目录迁移到新磁盘中
  6. linux自带磁盘加密工具下载,TrueCrypt(磁盘加密工具)
  7. java8 foreach 异常_错误处理 – 在java 8流foreach中抛出异常
  8. iOS 之 获取View所在控制器
  9. 社区出入登记1.0.53完整安装包+小程序前端
  10. Socket简单介绍(通过NSStream)
  11. python学习--交互式图形编程实例四
  12. Unity3d远程连接Hololens提示Cannot connect without a remote machine address specified
  13. 【刘文彬】【精解】EOS TPS 多维实测
  14. KVM halt-polling机制分析
  15. 机器学习入门——图解集成学习(附代码)
  16. flask + apidoc 生成接口文档(附加一个坑)
  17. IIS6上Ssl开发环境的搭建
  18. 分水岭算法(Watershed)
  19. Java栈,队列和循环队列的实现
  20. 高德导航是用的北斗卫星吗?

热门文章

  1. 使用Selenium Webdriver进行全屏截图
  2. 在事务外自动保存托管JPA实体
  3. ejb 示例 2018_EJB钝化和激活示例
  4. ldap java_使用LDAP保护Java EE6中的Web应用程序
  5. 安装tron_具有Tron效果的JavaFX 2 Form
  6. 领域驱动设计之领域模型_在领域驱动的设计,贫乏的领域模型,代码生成,依赖项注入等方面……...
  7. 在三个Java IDE中生成的三种常见方法
  8. 如何安全使用SWT的显示器asyncExec
  9. JSF基于事件的沟通:过时的方法
  10. 全新的Play模块资料库