字符串信息检测原理代码剖析

想要用单片机识别一长串字符并执行对应指令,有两种办法:数组法和循环法

错误的实例:

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;
} 

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

广药门徒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值