使用proteus8.9仿真时,遇到一个奇怪的Bug:发送端发送了0x0d 0x0a,能52只收到0x0d但是收不到0x0a,当校验是否收到
0x0a时Receive_State总是被置0,导致无法接收到完整字符串,如果屏蔽掉校验就能正常使用,很费解。
unsigned char Receive_State=0; // 第0-5位:长度位 第7位:接受完成标志位 第6位:\r0x0d接受完成标志位
unsigned char Receivr_Buff[30];// 串口接受缓存,最多接受30个字符
void Usart_Serial() interrupt 4
{
unsigned char Buff_byte;
ES = 0; //关闭串行中断
if(RI == 1)
{
RI = 0; //清除串行接受标志位
Buff_byte = SBUF; //从串口缓冲区接收数据
if((Receive_State&0x80) == 0) // 接收未完成
{
if((Receive_State&0x40)) // 接收到了0x0d
{
// if(Buff_byte != 0x0a) // 接收错误重新接收 /*Bug发送端发送了0x0d 0x0a,但是收不到0x0a,Receive_State总是被置0*/
// Receive_State=0;
// else
{
Receive_State|=0x80; // 接收完成
Receivr_Buff[Receive_State&0X3F] = '\0';
}
}
else // 未接收到0x0d
{
if(Buff_byte == 0x0d)
Receive_State|=0x40;
else
{
Receivr_Buff[Receive_State&0x3F] = Buff_byte;
Receive_State++;
}
}
}
}
ES = 1; // 允许串口中断
}