title: M5311模组烤机测试装置
tags: NBIOT
date: 2019-10-11 10:53:00
项目要求:
由于只是测试程序 所以我采用了arduino promini 来完成。
- 测试NB模组长时间工作的稳定性。
- 测试NB模组收发数据的延迟。
- 测试AT指令的稳定性。
由于公司部门工作需要,我们采购了移动的NB模组M5311,并绘制了PCB(PCB板是同事画的),最后我进行了AT指令的测试,效果还是很好的数据很稳定,然后准备做一个硬件对这款NB模组进行长时间烤机进行稳定性测试
模组采用移动M5311 http://iot.10086.cn/chipmodule/read/id/501
单片机采用 Arduino pro mini 进行测试。
测试代码如下:
/* 基于NBIOT的MQTT协议PCB测试代码
主要用于测试NB模组的耐久度与稳定性
便于PCB批量测试
开发者:阿正 wenzheng.club
备注:由于NB模组普遍存在AT指令无返回或者偶然出错的情况,所以本程序多次采用while(1),来保证AT指令接收,进而进行下一条指令的发送。
***其中命令发送与返回校验 模仿Stm32串口中断来实现的逻辑处理
*/
#include <SoftwareSerial.h> //虚拟串口库
SoftwareSerial mySerial(10, 11); // RX, TX 虚拟串口方便调试 11->NBTX
String AT = "AT";
String open_led = "AT+CMSYSCTRL=0,2";
String Set_Mqtt = "AT+MQTTCFG=\"服务器ip\",1883,\"ZXNBiot_mini\",60,\"root\",\"citc2018\",1";
String Clint_Mqtt = "AT+MQTTOPEN=1,1,1,1,1,\"mywill\",\"001bye\"";
String Publish_msg = "AT+MQTTPUB=\"/device/NB/pengwenzheng\",1,1,0,0,\"2019$\"";
String inputString = "";
bool stringComplete = false;
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
pinMode(12, OUTPUT); //硬复位NB模组
pinMode(13, OUTPUT); //状态指示灯
inputString.reserve(400);
delay(2000);
MQTT_int(); //MQTT初始化
}
void loop() {
if (Send_MQTT(Publish_msg, 50)) //发送成功则快闪一次
{
digitalWrite(13, 1);
delay(200);
}
digitalWrite(13, 0);
delay(5000);//每5秒发送一次
}
void MQTT_int() {
digitalWrite(12, 0);
delay(2000);
digitalWrite(12, 1);
delay(500);
digitalWrite(12, 0);
Serial.println("Begin.....");
while (!Send_MQTT(open_led, 50)); //循环发送LED配置命令 直到返回OK代表成功
delay(500);
while (1) { //一直等待连接IP地址
serialEvent();
if ( inputString.indexOf("+IP") != -1)
{
digitalWrite(13, 1);
delay(1000);
digitalWrite(13, 0);
break;
} else
Serial.println("Wait...");
}
while (1) {
if (Send_MQTT(Set_Mqtt, 60) == 1) {
while (!Send_MQTT(Clint_Mqtt, 60));
Serial.println("Clint_Mqtt!!!");
break;
}
delay(1000);
}
}
/*
* 函数名称:Send_MQTT(String msg, int wait)
* 入口参数:
* msg 发送的AT指令码
* wait 数据延时
* 出口参数:
* 1 数据返回成功即代表此次发送指令有效
* 0 数据返回失败即代表此次数据发送失败
* 备注:模仿Stm32串口中断来实现的数据返回处理
*/
int Send_MQTT(String msg, int wait) {
delay(1000);
mySerial.println(msg);
delay(wait);
serialEvent();
if (stringComplete) {
delay(100);
if ( inputString.indexOf("OK") != -1) {
Serial.println(inputString);
inputString = ""; //清除标志位
stringComplete = false; //清除标志位
while (Serial.read() >= 0) {}; //清空串口缓存
return 1;
}
else if ( inputString.indexOf("ERROR") != -1) {
Serial.println(inputString);
inputString = "";
stringComplete = false;
while (Serial.read() >= 0) {};
return 0;
}
}
}
/*
* 函数名称:Send_MQTT(String msg, int wait)
* 入口参数:
* msg 发送的AT指令码
* wait 数据延时
* 出口参数:
* 1 数据返回成功即代表此次发送指令有效
* 0 数据返回失败即代表此次数据发送失败
* 备注:模仿Stm32串口中断来实现的数据返回处理
*/
void serialEvent() {
while (mySerial.available()) {
char inChar = (char)mySerial.read();
inputString += inChar;
if (inChar == '\n') {
stringComplete = true;
}
}
}
具体的实现方法为:
利用arduino promini 的虚拟串口来调试AT指令,然后利用其朱串口进行数据打印调试。
备注:
其中最重要的是现有的需要AT指令的模组都需要进行返回值的判断以及顺序进行AT指令的发送,例如服务器的连接,需要提前进行服务器配置,之后再进行服务器的连接,上一步如果出错 则无法进行下一步的指令发送。
代码里多次使用while循环来实现了命令返回值判断。
例如:
while (!Send_MQTT(open_led, 50)); //循环发送LED配置命令 直到返回OK代表成功
其中Send_MQTT(String msg, int wait)函数就是采用的模拟Stm32串口中断来实现的快速数据返回校验。