M5311模組烤機測試裝置(Arduino)


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章