网站首页 > 技术文章 正文
串口通信
在实际应用场合中大多数采用中断收发或DMA收发数据,提高MCU的处理效率。而实际应用的通信帧数据大多数都是不定长的,即每一帧数据的长度不定,若是采用接收中断的方式来处理数据,若数据帧较长的话,需要多次进入接收中断,会降低MCU的处理效率;若采用DMA的方式来接收数据,其每次都需要接收完DMA设置的接收长度数据才会触发中断,这样的话短帧数据一帧以接收完但不会触发中断,需要在应用程序中提取数据,处理起来稍微麻烦。
串口的空闲中断
为了解决实际应用中高效率的接收不定长数据,STM32的我串口提供了一种IDLE中断,即空闲中断来实现不定长数据的接收,平时接收信号线无数据的时候,串口接收处于空闲状态下,当串口接收到数据后,串口接收处于忙状态,当串口在一定时间内没有接收到数据,即串口自动至于空闲状态,产生空闲中断。实现一帧数据的完整接收。
这个空闲判断时间可以采用STM32串口自带的时间来判断,也可自己设置定时器定时判断空闲的间隙时间,就好比FreeModbus中的T35us定时器的定时时隙一样。
空闲中断实现不定长数据接收
在串口初始化的代码中开启串口空闲中断后,由于STM32的HAL库中的串口中断服务函数中没有相关IDLE中断处理的代码,所以需要用户自己按照HAL库的风格,添加自己的中断服务函数以及中断回调函数,具体实现的过程如下:
添加callback回调函数,在回调函数中处理串口接收到的数据
主函数中添加实现数据回发的代码,即将接收到的代码再发送回去。
串口的基本配置,首先应用Cube MX软件配置系统时钟树,为所有外设配置时钟。
配置串口,使用UART1,并采用DMA收发方式,DMA采用正常模式,Byte对齐模式,内存地址递增,外设地址不变。
串口的时钟采用采用16周期采用模式,提高串口通信数据的准确性。
猜你喜欢
- 2024-10-12 STM32单片机-多串口printf()问题与ASCII码解析
- 2024-10-12 stm32F0 串口的几个特殊功能 stm32f1串口引脚
- 2024-10-12 STM32串口发送用哪个中断? stm32f4串口发送数据
- 2024-10-12 STM32F103编程学习——USB虚拟串口篇
- 2024-10-12 STM32F4入坑日记——串口发送数据(非中断)
- 2024-10-12 STM32 HAL库串口中断发送过程 stm32f4串口中断
- 2024-10-12 在货物监控设备研发时,STM32串口第一个字节丢失解怎么解决?
- 2024-10-12 STM32单片机采用环形缓冲区实现串口中断数据接收管理
- 2024-10-12 基于STM32的串口与DMA的完美组合(上)
- 2024-10-12 STM32下载程序新思路--使用串口下载STM32程序
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)