M5311模组烤机测试装置(Arduino)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/switch_love_case/article/details/88922176

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串口中断来实现的快速数据返回校验。

猜你喜欢

转载自blog.csdn.net/switch_love_case/article/details/88922176