STM32
直播中

李超

7年用户 1349经验值
私信 关注
[问答]

串口接收接收不定长数据的具体编程要点是什么?

如何利用IDLE判断一帧数据是否接收成功?
串口接收接收不定长数据的具体编程要点是什么?

回帖(1)

陈舒斌

2021-12-9 11:04:34
平台:STM32ZET6(核心板)+ST-LINK/V2+USB串口线+SIM800C+杜邦线(用于连接SIM800C和STM32开发板)

    串口接收不定长数据采取的思路是:在STM32内存中设置一个缓存区(数组),在中断中将数据逐个放入到缓存区中,然后判断一帧数据是否接收完成。
    关键点:如何判断一帧数据是否接收成功?
    思路:利用IDLE中断判断接收一帧数据完成,其中IDLE中断是串口接收到一帧数据之后发生的中断,这里的一帧数据就是一次发送来的数据,可以是一个字节或者更多字节,也称一包数据。

    用到中断就需要配置中断,然后再在其中断处理函数中进行处理。IDLE中断和RXNE中断的区别是接收到一字节数据就发生RXNE中断,而接收到一帧数据就发生IDLE中断。RXNE接收数据中断的清除,只要将接收到的一个字节读出来即可,IDLE中断的清除,F1系列的单片机,需要先读SR寄存器,再读DR寄存器。具体内容以手册为准。

    串口接收接收不定长数据的具体编程要点:

    1. 使能帧接收中断(位于串口配置函数USART_Config中):







    2.编写中断处理函数,其中DEBUG_ReceiveState,记录是否接收到一帧数据完成,如果为1,代表接收完一帧数据,如果为0,代表尚未接收完一帧数据。DEBUG_RxCounter,记录接收的一帧数据的字节数。USART_MAX_RECV_LEN,是一个代表接收最大字节数的宏(这里设置为1024)。缓存数组DEBUG_USART_RX_BUF[USART_MAX_RECV_LEN],存放接收到的数据。






    3.处理接收到的数据,其中DEBUG_ReceiveState,记录是否接收到一帧数据完成,如果为1,代表接收完一帧数据,如果为0,代表尚未接收完一帧数据。因此,在主函数里,我们可以循环测试该标记是否为1,查询接收状态,如果接受完成,再做进一步处理,这里的处理是先回显,输出到调试助手,再将内容发送到SIM800C。效果:电脑通过直接串口1发送AT指令,单片机接收串口1的AT指令到缓存数组DEBUG_USART_RX_BUF[USART_MAX_RECV_LEN]中,单片机将AT指令发送给串口2,即SIM800C工作串口,从而控制SIM800C工作。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分