开启辅助访问 切换到窄版

打印 上一主题 下一主题

单片机串口接收不定长数据的通用方法

[复制链接]
作者:蝶儿哼哼 
版块:
MCU单片机技术 stm 发布时间:2020-10-11 09:11:43
20230
楼主
跳转到指定楼层
| 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我之前写过一篇文章关于STM32单片机接收不定长数据的方法,这篇文章可以在瑞生网(http://Mrs.Pub)搜索关键字“不定长”看到,不过...这个只是针对某些STM32单片机的方法,比如F1系列的就可以使用,然而...我在后续使用其它STM32系列的单片机时,发现这个方法不能用,比如L0系列的,我用IDLE判断,总是还没有接收完一帧数据,就会发生IDLE中断,于是...我只能用下面的通用方法来解决了,这个通用的方法,其实原理和使用IDLE的原理一样:接收完一个字节以后,如果超过了一定的时间,就认为是接收完一帧数据了。首先...我们要知道,串口是接收一个字节,就会发生一次中断,如果一帧数据包含10个字节,就会发生10次中断。在接收一个字节以后,会紧跟着接收下一个字节,如果时间超了一定值,就代表一帧数据已经发完了。下面,我分别用STM32和51单片机的代码来演示一下这个通用代码的实现。1、STM32(以STM32L0系列为例)voidLPUART1_IRQHandler(void)// 低功耗串口1中断服务函数{if(__HAL_UART_GET_FLAG(&hlpuart1, UART_FLAG_RXNE))// 如果接收到一个字节{Res_Buf[Res_Count++]=hlpuart1.Instance->RDR;// 把数据保存到接收数组Res_Sign=1;// 表示已经接收到数据Res_Times=0;// 延时计数器清0}}2、51单片机(以STC8系列为例)voidUART1_Isr interrupt 4// 串口中断服务函数{if(RI)// 如果接收到一个字节{RI =0;// 中断标志位清0Res_Buf[Res_Count++]=SBUF;// 把数据保存到接收数组}}3、在主函数中使用if(Res_Sign==1)// 如果串口接收到数据{//延时等待接收完一帧数据do{Res_Times++;// 延时计数器+1HAL_Delay(1);// 延时1ms}while(Res_Times

本帖子中包含更多资源

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

回复

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表