//写一个字节到串口0接收缓冲区中,解析转义字符
void Uart0_Write_RX_Buff(uchar ch)
{
if(Uart0.Frame)//上一帧数据尚未处理
{
return;
}
if(Uart0.RxLen>_Uart0_RxBuffLen)//缓冲区溢出
{
Uart0.RxLen=0;
}
if(ch==0xAA)//收到帧头
{
Uart0.RxLen=0;
Uart0.ZhuanYi=0;
}
else if(ch==0xA9)//收到帧尾
{
Uart0.Frame++;//外面的主循环不断判断这个帧标记即可……
}
else if(ch==0xA8)//转义字符
{
Uart0.ZhuanYi=1;
}
else
{
if(Uart0.ZhuanYi)
{
if(ch<=2)
{
Uart0.RxBuff[Uart0.RxLen++]=0xA8+2-ch;
}
else//转义出错
{
Uart0.RxLen=0;
}
Uart0.ZhuanYi=0;
}
else
{
Uart0.RxBuff[Uart0.RxLen++]=ch;//普通字节
}
}
}
//串口0中断服务程序
void Uart0_Isr(void) interrupt UART0_VECTOR
{
char ch;
……
if(RI)
{
RI=0;
ch = SBUF0;
Uart0_Write_RX_Buff(ch);//保存接收字节到接收缓冲区中
}
……
}
|