正点原子串口中断实验中发送不带回车的数据后再发送带回车的数据返回会将不带回车的数据也返回 程序改进

2019-07-21 03:53发布

本帖最后由 lyq1211 于 2019-3-25 22:42 编辑

正点原子串口接收中断例程中,发送的数据必须以0x0d和0x0a结尾,才会返回发送的数据;否则会将发送的数据存储在USART_RX_BUF[]中,直到超过数据存储最大长度(#define USART_REC_LEN     200)后清空缓存。若发送的数据未超过最大长度且未以0x0d和0x0a结尾,下次发送数据以0x0d和0x0a结尾,则会将两次发送的数据都显示出来。
这里对程序稍加修改,实现不回显未0x0d和0x0a结尾的数据。核心思想是空闲中断的运用。
1.在串口初始化中开启空闲中断。
[mw_shl_code=c,true]USART_ITConfig(USART1,USART_IT_IDLE,ENABLE); [/mw_shl_code]
2.串口中断函数里增加空闲中断函数;再定义一个标志位,一帧数据接收完成后,标志位置位。
[mw_shl_code=c,true]                if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
                {
                        Clear = USART1->SR;
                        Clear = USART1->DR;
                        Flag_Once = 1;
               
                }[/mw_shl_code]
3.主函数中,将原while(1)中程序包含在刚才标志位置位的条件中。即接收完一帧数据后,对数据进行判断:若收到以0x0d和0x0a结尾的数据,
则回显发送的数据,否则接收状态标记USART_RX_STA清零。

[mw_shl_code=c,true]                if(Flag_Once == 1)
                {
                        Flag_Once = 0;
                        if(USART_RX_STA&0x8000)
                        {                                          
                                len=USART_RX_STA&0X3FFF;//此次接收到的数据长度
                        
                                printf(" 您发送的消息为: ");
                                for(t=0;t<len;t++)
                                {
                                        USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
                                        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
                                }
                                USART_RX_STA=0;
                        }
                        else
                                USART_RX_STA = 0;
                }[/mw_shl_code]
这样就能实现改进目的,经反复测试,效果良好。





0条回答

一周热门 更多>