AT指令的发送与接收

AT指令的发送与接收

  • 存在问题
  • 现存代码
  • 运行结果

存在问题

1.接收数据未结束就进入检测环节,导致一直检测不到指定字符串。
解决办法: 接收到‘\n’以后才进入检测环节(用strstr进行对比),否则在while中进行等待。

2.接收失败以后未进行处理,导致接收错误以后卡死。
解决办法:使用switch case进行处理

现存代码

接收中断函数

void Uart2() interrupt 8
{
	IE2  &= ~0x01;   //关闭串口2中断
    if (S2CON & S2RI)
    {
         S2CON &= ~S2RI;         //清除S2RI位
		 Uart2_Buf[First_Int] = S2BUF;  	  //将接收到的字符串存到缓存中
		 First_Int++;                			//缓存指针向后移动
		 if(First_Int > Buf2_Max)       		//如果缓存满,将缓存指针指向缓存的首地址
		{
		  First_Int = 0;
		}
		if(Uart2_Buf[First_Int] == '\n')
		{
			First_Int = 0;
			startCm = 0x01;//接收完一条语句标志
		}
    }
    if (S2CON & S2TI)
    {
      S2CON &= ~S2TI;         //清除S2TI位
    }
		IE2  |= 0x01;   //使能串口2中断
}

发送AT并进行根据相应情况处理

void Set_Pdu_Mode(void)
{
	u8 a = 1;
	if(atKey == 1)//允许发送AT指令
	{
	    atKey  = 0;
	    UartSendStr("test start\r\n");//串口1输出开始提示
		while(a != 9)
		{   
			switch (a)
			{
				case 1:
		    a = Second_AT_Command("AT","OK");//如果a =9则表明最后一条语句发送完毕,跳出循环,否则一直进行指定指令的发送
				delay2s();
			  if(a == 0) //如果正常发送,则进行下一步
					a = 2;
			  break;
				case 2:
		    a =Second_AT_Command("AT+CSTT=\"CMNET\"","OK");
				delay2s();
				
			  if(a == 0) //如果正常发送,则进行下一步
					a = 3;
			  break;
				case 3:
		    a = Second_AT_Command("AT+CIICR","OK");
				delay2s();
			  if(a == 0) //如果正常发送,则进行下一步
					a = 4;
			  break;
				case 4:
		    a = Second_AT_Command("AT+MCONFIG=\"test\",\"\",\"\"","OK");
				delay2s();
			  if(a == 0) //如果正常发送,则进行下一步
					a = 5;
			  break;
				case 5:
				a = Second_AT_Command("AT+MIPSTART=\"47.111.138.129\",\"1883\"","OK");
				delay2s();
				if(a == 0) //如果正常发送,则进行下一步
					a = 6;
			  break;
				case 6:
				a = Second_AT_Command("AT+MCONNECT=1,60","OK");
				delay2s();
				if(a == 0) //如果正常发送,则进行下一步
					a = 7;
			  break;
				case 7:
				a =Second_AT_Command("AT+MSUB=\"mqtt/topic\",0","OK");
				delay2s();
				if(a == 0) //如果正常发送,则进行下一步
					a = 8;
			  break;
				case 8:
				a = Second_AT_Command("AT+MPUB=\"mqtt/topic\",0,0,\"strat\"","OK");
				delay2s();
				if(a == 0) //如果正常发送,则进行下一步
					a = 9;
			  break;
				defalut:
				  a = 1;
			}
		}
}

检测函数

u8 Find(u8 *a)
{ 
	while(startCm != 0x01);//等待接收完毕
	startCm = 0x00; 
   if(strstr(Uart2_Buf,a)!=NULL)
	{ 		
		return 0;
	}
	else
	{	
		return 1;
	}
}

发送函数

u8 Second_AT_Command(u8 *b,u8 *a )    
{
	u8 *c;
	c = b;
    CLR_Buf2();
    count = 0;
	while(1)                    
	{
		b = c;						 //将字符串地址给b
        Uart2SendStr(b);
        UART2_SendLR();	//发送回车换行
		if(Find(a))           //查找需要应答的字符
		{
			  count++;
			if(count > 10) //10次不成功则返回到指定位置
			{
                UartSendStr("errow");
				return 1;
			}
       }
	  else
	  {
       UartSendStr("righe");			
		  return 0;
	  }
   }
	CLR_Buf2(); 
}

运行结果

[10:58:30.045]收←◆AT
OK

[10:58:30.551]收←◆AT+CSTT=“CMNET”
ERROR

[10:58:31.071]收←◆AT
OK

[11:02:59.633]收←◆
RDY

+CFUN: 1

+CPIN: READY
AT
OK

[11:02:59.847]收←◆
Call Ready

[11:02:59.889]收←◆AT
OK

[11:03:00.140]收←◆AT
OK

[11:03:00.648]收←◆AT+CSTT=“CMNET”
OK

[11:03:01.189]收←◆AT+CIICR
[11:03:01.580]收←◆
OK

[11:03:02.089]收←◆AT+MCONFIG=“test”,"",""
OK

[11:03:02.605]收←◆AT+MIPSTART=“47.111.138.129”,“1883”
OK

[11:03:03.659]收←◆
CONN
[11:03:03.685]收←◆ECT OK

[11:03:03.922]收←◆AT+MIPSTAR
[11:03:03.945]收←◆T=“47.111.138.129”,“1883”
[11:03:03.975]收←◆
OK
ALREADY CONNECT

ERROR

[11:03:04.428]收←◆AT+MCONNECT=1,60
OK

[11:03:04.962]收←◆
CONNACK OK
AT+MSUB=“mqtt/topic”,0
OK

[11:03:05.223]收←◆AT+MSUB=“mqtt/topic”,0
ERROR

[11:03:05.531]收←◆
SMS Re
[11:03:05.573]收←◆ady

[11:03:05.656]收←◆
SUBACK

[11:03:05.734]收←◆AT+MPUB=“mqtt/topic”,0,0,“strat”
OK

[11:03:06.439]收←◆
+MSUB: “mqtt/topic”,5 byte,strat

你可能感兴趣的:(AT)