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串口中斷來實現的快速數據返回校驗。