想要用单片机识别一长串字符并执行对应指令,有两种办法:数组法和循环法
错误的实例:
if(RXDATE=='L')
{
if(RXDATE=='E')
{
if(RXDATE=='D')
{
if(RXDATE=='1')
{
LED1=0;
}
if(RXDATE=='2')
{
LED2=0;
}
if(RXDATE=='3')
{
LED3=0;
}
if(RXDATE=='4')
{
LED4=0;
}
}
}
}
void UART_SER (void) interrupt 4 //串行中断服务程序
{
if(RI) //判断是接收中断产生
{
RI=0; //标志位清零
RXDATE=SBUF; //读入缓冲区的值
}
if(TI) //如果是发送标志位,清零
TI=0;
}
该例子妄想用接受的一个一个字节做连续检测,实际上是行不通的,因为胺片及代码执行的速度极快,一般不到一us就一条代码,那检测完第一个字符为L第二个字符还没到就会出错,所以失去了原来的作用
下面是解决办法:
循环法:
if(RxDatas[0] == 0xAA && RxDatas[1] == 0xBB && RxDatas[2] == 0xCC)//串口返回名字属性 { while(1) { // Serial2_SendString("Num=%d\r\n"); //串口返回名字属性 if(Serial2_GetRxFlag() == 1) //检查串口接收数据的标志位 { while(1) { if(Serial2_GetRxData()==0x00) { while(1) { if(Serial2_GetRxFlag() == 1) //检查串口接收数据的标志位 { Serial2_Getname(6); Delay_ms(200); break; } } break; } // }break; } } }
数组法:
char square[50]=0;
for(pp=0;pp<50;pp++)
{
if(square[pp]=='L')
{
if(square[pp+1]=='E')
{
if(square[pp+2]=='D')
{
if(square[pp+3]=='1')
{
LED1=0;
}
if(square[pp+3]=='2')
{
LED2=0;
}
if(square[pp+3]=='3')
{
LED3=0;
}
if(square[pp+3]=='4')
{
LED4=0;
}
}
}
}
}
void UART_SER (void) interrupt 4 //串行中断服务程序
{
if(KK==50)
{
KK=0;
}
if(RI) //判断是接收中断产生
{
RI=0; //标志位清零
square[KK]=SBUF; //读入缓冲区的值
}
KK++;
if(TI) //如果是发送标志位,清零
TI=0;
}
标签:Serial2,代码,RxDatas,剖析,while,break,串口,字符串,RXDATE
From: https://blog.csdn.net/2301_80317247/article/details/141335068