需求:在串口中断中判断接收的第一帧数据是否为为0xAA,如果是:向电脑回传数据,否则丢弃该数据
出现的问题:_if(BUF[0]==0xaa&&BUF[7]!=0x55)_条件无法进入,无法向电脑回传数据
代码如下
void Uart1(void) interrupt 4 using 1
{
Flag=TRUE; //接收到数据,接收标识符有效
if (RI)
{/*RI置1表示串口接收完成,SBUF已经写入数据申请进入中断*/
RI = 0; //清除RI位 (该位必须软件清零)
BUF[cnt] = SBUF;/*
将单片机缓存中的数据写入BUF[cnt]*/
if(BUF[0]==0xaa&&BUF[7]!=0x55) /*数据传输中*/
{
SendDataByUart1(BUF[cnt]);/*
将串口接收到的数据发送回电脑*/
cnt++;/*继续接收数据*/
}
else if((BUF[0] == 0xAA)&&(BUF[7] == 0x55))/*一条完整数据传输完毕*/
{
ES = 0;/*关闭串口中断,防止数据被覆盖*/
cnt = 0;/*重置数据位标记*/
sign = 1;/*标记:该条数据可以进行下一步处理*/
}
else
{
cnt = 0;
return;
}/*数据中间出现错误,重置数据位标记并跳出中断*/
}
if (TI)
{ //在停止位开始发送时,该位置1
TI = 0; //清除TI位(该位必须软件清零)
}
ES = 1; // 串口1中断打开
}
现象:无法向电脑回传数据
只有将条件改成_if(BUF[0]!=0xaa&&BUF[7]!=0x55)_才能进入条件向电脑回传数据
更改后代码如下:(可忽略)
void Uart1(void) interrupt 4 using 1
{
Flag=TRUE; //接收到数据,接收标识符有效
if (RI)
{/*RI置1表示串口接收完成,SBUF已经写入数据申请进入中断*/
RI = 0; //清除RI位 (该位必须软件清零)
BUF[cnt] = SBUF;/*
将单片机缓存中的数据写入BUF[cnt]*/
if(BUF[0]!=0xaa&&BUF[7]!=0x55) /*数据传输中*/
{
SendDataByUart1(BUF[cnt]);/*
将串口接收到的数据发送回电脑*/
cnt++;/*继续接收数据*/
}
else if((BUF[0] == 0xAA)&&(BUF[7] == 0x55))/*一条完整数据传输完毕*/
{
ES = 0;/*关闭串口中断,防止数据被覆盖*/
cnt = 0;/*重置数据位标记*/
sign = 1;/*标记:该条数据可以进行下一步处理*/
}
else
{
cnt = 0;
return;
}/*数据中间出现错误,重置数据位标记并跳出中断*/
}
if (TI)
{ //在停止位开始发送时,该位置1
TI = 0; //清除TI位(该位必须软件清零)
}
ES = 1; // 串口1中断打开
}
测试结果