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