本帖最后由 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]
这样就能实现改进目的,经反复测试,效果良好。
一周热门 更多>