AT指令的发送与接收

您所在的位置:网站首页 打印指令发送错误怎么办 AT指令的发送与接收

AT指令的发送与接收

2023-10-26 19:29| 来源: 网络整理| 查看: 265

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3