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

  • 11
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
修改后的程序如下: ```c #include "reg51.h" #include "intrins.h" #define FOSC 11059200UL #define BRT (65536 - FOSC / 115200 / 4) sfr AUXR = 0x8e; sfr T2H = 0xd6; sfr T2L = 0xd7; sfr S2CON = 0x9a; sfr S2BUF = 0x9b; sfr IE2 = 0xaf; sfr P0M1 = 0x93; sfr P0M0 = 0x94; sfr P1M1 = 0x91; sfr P1M0 = 0x92; sfr P2M1 = 0x95; sfr P2M0 = 0x96; sfr P3M1 = 0xb1; sfr P3M0 = 0xb2; sfr P4M1 = 0xb3; sfr P4M0 = 0xb4; sfr P5M1 = 0xc9; sfr P5M0 = 0xca; bit busy; char wptr; char rptr; char buffer[16]; void Uart2Isr() interrupt 8 { if (S2CON & 0x02) { S2CON &= ~0x02; busy = 0; } if (S2CON & 0x01) { S2CON &= ~0x01; buffer[wptr++] = S2BUF; wptr &= 0x0f; } } void Uart2Init() { S2CON = 0x10; T2L = BRT; T2H = BRT >> 8; AUXR = 0x14; wptr = 0x00; rptr = 0x00; busy = 0; } void Uart2Send(char dat) { while (busy); busy = 1; S2BUF = dat; } void Uart2SendStr(char *p) { while (*p) { Uart2Send(*p++); } } void main() { P0M0 = 0x00; P0M1 = 0x00; P1M0 = 0x00; P1M1 = 0x00; P2M0 = 0x00; P2M1 = 0x00; P3M0 = 0x00; P3M1 = 0x00; P4M0 = 0x00; P4M1 = 0x00; P5M0 = 0x00; P5M1 = 0x00; Uart2Init(); IE2 = 0x01; EA = 1; Uart2SendStr("Uart Test !\r\n"); while (1) { if (rptr != wptr) { char received = buffer[rptr++]; rptr &= 0x0f; if (received == 'o') { P2 = 0x20; } else { P2 = 0x00; } Uart2Send(received); } } } ``` 其中,修改的部分为: ```c if (received == 'o') { P2 = 0x20; } else { P2 = 0x00; } ``` 该部分代码会检测接收到的字符是否为字母'o',如果是,则点亮P2.5灯(二进制为0010 0000),否则将P2口置为0(灭灯)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值