使用DMA+USART接收无固定长度的串行数据
2012-06-18 23:20
323 查看
在一些应用中MCU接收串行数据时,会出现接收到多个不同长度的数据流,由于STM32没有串行接收超时功能,这使得STM32的用户觉得不是很方便。为此我使用STM32的定时器实现接收无固定长度的串行数据,希望对STM32的用户有所帮助。
一、方案说明:
1、在使用DMA+USART接收数据时,将接收引脚(RX)的外部中断打开,当接收第一个数据的起始位时产生外部中断,在外部中断处理程序中,关闭外部中断功能,同时使能定时器(本例程中使用SysTick),开始接收数据的计时;
2、在DMA接收到最长的数据流时,在DMA中断处理程序中,清除中断标志,设置接收结束标志和长度。
3、在定时器中断中,计数器加一,当计数器达到延时计数值时,表明DMA接收到的数据没有到达最大值。此时停止定时器,计算已经接收数据的长度,设置接收结束标志。
4、在主程序中,对接收的数据进行处理后,重新初始化DMA,并打开接收引脚(RX)的外部中断功能。
二、代码使用说明:
1、用户需根据自己的应用,设置DMA接收的最长数据长度,根据数据长度和串口传输的波特率计算出需定时的时间长度,设置延时计数值用以定时比较。
#define Rx_Buffer_Size 64
#define DELAY_TIME 7
unsigned char RX_Buffer[Rx_Buffer_Size];
一、方案说明:
1、在使用DMA+USART接收数据时,将接收引脚(RX)的外部中断打开,当接收第一个数据的起始位时产生外部中断,在外部中断处理程序中,关闭外部中断功能,同时使能定时器(本例程中使用SysTick),开始接收数据的计时;
2、在DMA接收到最长的数据流时,在DMA中断处理程序中,清除中断标志,设置接收结束标志和长度。
3、在定时器中断中,计数器加一,当计数器达到延时计数值时,表明DMA接收到的数据没有到达最大值。此时停止定时器,计算已经接收数据的长度,设置接收结束标志。
4、在主程序中,对接收的数据进行处理后,重新初始化DMA,并打开接收引脚(RX)的外部中断功能。
二、代码使用说明:
1、用户需根据自己的应用,设置DMA接收的最长数据长度,根据数据长度和串口传输的波特率计算出需定时的时间长度,设置延时计数值用以定时比较。
#define Rx_Buffer_Size 64
#define DELAY_TIME 7
unsigned char RX_Buffer[Rx_Buffer_Size];
相关文章推荐
- STM8L 在USART中使用DMA来发送与接收数据
- STM32+cubeMX+DMA+USART 接收任意长度的数据
- .一数据报的总长度为3820字节,其数据部分为3800字节长(使用固定首部),需要分片为长度不超过1420字节的数据报片。试给出分片后每个数据报片相关字段的值(包括MF、DF、片偏移)。
- socket发送和接收固定长度数据的函数
- STM32实现USART+DMA接收未知长度的数据和发送
- STM32L152 USART HAL库接收任意长度数据详细解析
- 在阻塞式的tcp连接中使用recv接收数据未达到指定长度返回问题
- C++ Builder XE8 安卓开发之使用TidTCPClient控件获取接收数据长度的方法
- struts2拦截器如何返回json数据?如何使用Jquery(ExtJs)接收拦截器返回的数据?
- 使用Hibernate 创建数据表时,如何使数据库中的字段的长度和Hibernate映射的长度相等呢?
- STM32F4 UART1 DMA发送和接收不定长度数据
- mysql数据库 text类型的长度限制,使用change_column来进行长度的修改并不影响原有数据
- 使用RegSetValueEx时一定要确定写入的长度与实际的长度相符,这样才能保存数据的正确性
- SQL Server 系统表使用-查询指定数据库中用户表及其列、数据类、长度
- 多线程串口接收数据 | 全局变量的使用
- Android-使用Timer实现5秒内接收到数据就进行打印,若超过5秒后没有收到数据再打印
- VC++ TRACE Bug Trace所能接收的数据长度不能大于508字符
- java 使用poi导出excel,可控制固定前2列固定标头排版,带统计数据格式的
- ThinkPHP中使用ajax接收json数据的方法
- 使用js函数实现的通过输入框中数据的长度来控制光标聚焦位置