初级会员

- 积分
- 142
- 金钱
- 142
- 注册时间
- 2013-1-23
- 在线时间
- 4 小时
|
原子串口文件中关于串口接收完毕的判断条件是收到回车即连续接收到0x0D,0x0A。如果在一次传送中收到了0x0D,紧接着判断下一个是不是0x0A,如果不是,就认为此次接收错误,并清除缓存。这样以来就有一个问题,假如0x0D确实是我想要传输的数据,并不是回车的开端,那么如果接下来收到的不是0x0A,就会产生数据的丢失,是否可以作以下优化:
void USART1_IRQHandler(void) //串口 1 中断服务程序
{
u8 Res;
#ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了 ,说明要使用 ucosII 了 .
OSIntEnter();
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{ //接收中断(接收到的数据必须是 0x0d 0x0a 结尾)
Res =USART_ReceiveData(USART1);//(USART1 ->DR); //读取接收到的数据
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了 0x0d
{
if(Res == 0x0a)
{
USART_RX_STA|=0x8000; //接收完成了
USART_RX_STA -= 2;//剔除最后接收到的0x0d
return;
}
else if(Res != 0x0d)
{
USART_RX_STA &= (~0x4000);
}
}
else if(Res==0x0d)
{
USART_RX_STA|=0x4000;
}
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))
USART_RX_STA=0;//接收数据溢出,重新开始接收
}
}
#ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了 ,说明要使用 ucosII 了 .
OSIntExit();
#endif
}
|
|