当前位置:   article > 正文

STM32 EC200N-CN MQTT链接服务器开发实录_ec200n-cn模块

ec200n-cn模块

开发环境

硬件:STM32F091CBT6 、EC200N-CN模块板 、USB-TTL串口助手

软件:VS CODE  、 STM32CUBEMX、IAR 8.32

1.硬件设计

连接好EC200N-CN模块和单片机主板。

EC200N-CN模块设计时注意供电和IO电平转换。

EC200N-CN是低功耗的,其主串口用的是1.8V电压域的,一般使用的STM32F0系列单片机IO口是3.3V电平的,两者连接的时候需要电平转换。

电平转换在EC200N的硬件设计手册里有电路图。

我这边设计的EC200N-CN模块预留了

PWRKEY(模块开关机引脚)

RESET_N(模块复位引脚)

主串口-RXD

主串口-TXD引脚。

基本这几个引脚就够一般的物联网应用使用了。

注意注意:

我遇到的大坑1:

上电后,PWKEY引脚一定要低电平才行,低电平才能打开模块,否则模块不开机收不到AT指令,一开始犯了这个错误,因为模块自己印出来的PWKEY通过三极管做了反向处理,理解错了开机电平,导致模块一直不开机。

我遇到的大坑2:

和单片机通讯时,单片机这边因为电平转换要加上拉电阻。

如果没有上拉电阻,两者无法通讯。

EC200N-CN和STM32F091CB 串口通讯故障排查。

即使加了上拉电阻后,任然存在一个BUG。

后面才解决掉。

2.程序编写

配置好单片机IO口的串口模块、波特率,然后就直接发送AT指令就可以了。

ATI

AT+CPIN?

AT+CSQ

AT+CGREG?

AT+CGATT?

AT+QMTCFG="recv/mode",0,0,1
AT+QMTOPEN=0,"www.sukon-cloud.com",9006链接物联网平台
AT+QMTCONN=0,"SMETTest","SMETTest","123456"登录平台
AT+QMTPUBEX=0,0,0,0,"sys/device/SMETTest/variant_data",85发布MQTT消息
{"type":"variant_data","version":"1.0","time":1638766638000,"params":{"UAV":220.9}}

在收到>后发送保文数据。

常用AT指令说明


1、AT
说明: 检测AT指令收发是否正常
模组收到指令回复:

  1. AT
  2. OK


2、AT+CPIN?
说明: 查询SIM卡状态(是否插入SIM卡、锁定SIM卡、解锁SIM卡),返回 READY则表示模组正常
模组收到指令回复:

  1. AT+CPIN?
  2. +CPIN: READY
  3. OK


3、AT+CREG?
说明: 查询当前网络注册状态,正常则回复 +CREG: 0,1
模组收到指令回复:

  1. AT+CREG?
  2. +CREG: 0,1
  3. OK


4、AT+CEREG?
说明: 查询当前EPS网络注册状态,正常则回复 +CEREG: 0,1
模组收到指令回复:

  1. AT+CEREG?
  2. +CEREG: 0,1
  3. OK

5.AT+QMTCFG="recv/mode",0,0,1

模组收到指令回复:

  1. AT+QMTCFG="recv/mode",0,0,1
  2. OK

6.AT+QMTOPEN=0,"www.sukon-cloud.com",9006

模组收到指令回复:

  1. 00> AT+QMTOPEN=0,"www.sukon-cloud.com",9006
  2. 00>
  3. 00> OK
  4. 00>
  5. 00> +QMTOPEN: 0,0

7.AT+QMTCONN=0,"SMETTest","SMETTest","123456"

模组收到指令回复:

  1. 00> AT+QMTCONN=0,"SMETTest","SMETTest","123456"
  2. 00>
  3. 00> OK
  4. 00>
  5. 00> +QMTCONN: 0,0,0

8.AT+QMTPUBEX

AT+QMTPUBEX=0,0,0,0,"sys/device/SMETTest/variant_data",85

模组收到指令回复:

  1. 00> AT+QMTPUBEX=0,0,0,0,"sys/device/SMETTest/variant_data",85
  2. 00>
  3. 00> >

模组收到指令回复:

9.{"type":"variant_data","version":"1.0","time":1638766638000,"params":{"UAV":220.9}}

模组收到指令回复:

  1. 00> > {"type":"variant_data","version":"1.0","time":1638766638000,"params":{"UAV":220.5}}
  2. 00>
  3. 00> OK

测试程序:

  1. char Sendbuf[EC20_SEND_BUFF_SIZE];
  2. ErrorStatus F_TestEC200N(uint8_t *cmd)
  3. {
  4. // scanf("%s",buf);
  5. uint8_t lu8_cmd =0;
  6. lu8_cmd = (uint8_t)(*cmd);
  7. memset(&Sendbuf[0],0x00,EC20_SEND_BUFF_SIZE);
  8. // sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CPIN?");
  9. switch (lu8_cmd)
  10. {
  11. case 0:
  12. return 1;
  13. break;
  14. case 1:
  15. /* code */
  16. sprintf((char*)&Sendbuf[0],"%s\r\n","AT");
  17. break;
  18. case 2:
  19. /* code */
  20. sprintf((char*)&Sendbuf[0],"%s\r\n","ATI");
  21. break;
  22. case 3://查询SIM卡
  23. /* code */
  24. sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CPIN?");
  25. break;
  26. case 4://查询信号,31最大,小于10证明信号超级不好
  27. /* code */
  28. sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CSQ");
  29. break;
  30. case 5://查询PS注册情况,注册则返回1,证明获取IP,可以进行网络使用啦
  31. /* code */
  32. sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CGREG?");
  33. break;
  34. case 6://附着网络是否成功
  35. /* code */
  36. sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CGATT?");
  37. break;
  38. case 7://设置数据格式
  39. /* code */
  40. sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTCFG=\"recv/mode\",0,0,1");
  41. break;
  42. case 8://打开工业物联网云端口
  43. /* code */
  44. sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTOPEN=0,\"www.sukon-cloud.com\",9006");
  45. break;
  46. case 9://这步执行成功后,设备应该在线了。
  47. /* code */
  48. sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTCONN=0,\"SMETTest\",\"SMETTest\",\"123456\"");
  49. break;
  50. case 10://发送数据命令
  51. /* code */
  52. sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTPUBEX=0,0,0,0,\"sys/device/SMETTest/variant_data\",85");
  53. gu16_len = strlen(Sendbuf);
  54. MX_FEED_IWDG();
  55. HAL_UART_Transmit(&huart4, (uint8_t *)&Sendbuf,61, 0xffff);//huart1需要根据你的配置修改
  56. MX_FEED_IWDG();
  57. MX_FEED_IWDG();
  58. HAL_Delay(800);
  59. memset(&Sendbuf[0],0x00,EC20_SEND_BUFF_SIZE);
  60. sprintf((char*)&Sendbuf[0],"%s\r\n","{\"type\":\"variant_data\",\"version\":\"1.0\",\"time\":1638766638000,\"params\":{\"UAV\":220.5}}");
  61. gu16_len = strlen(Sendbuf);
  62. HAL_UART_Transmit(&huart4, (uint8_t *)&Sendbuf,87, 0xffff);//huart1需要根据你的配置修改
  63. (*cmd) = 0;
  64. return 1;
  65. break;
  66. case 11://Paload数据
  67. /* code */
  68. sprintf((char*)&Sendbuf[0],"%s\r\n","{\"type\":\"variant_data\",\"version\":\"1.0\",\"time\":1638766638000,\"params\":{\"UAV\":220.5}}");
  69. break;
  70. case 20://清除链接
  71. /* code */
  72. sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=0");
  73. break;
  74. case 21://清除链接
  75. /* code */
  76. sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=1");
  77. break;
  78. case 22://清除链接
  79. /* code */
  80. sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=2");
  81. break;
  82. case 23://清除链接
  83. /* code */
  84. sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=3");
  85. break;
  86. case 24://清除链接
  87. /* code */
  88. sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=4");
  89. break;
  90. case 25://清除链接
  91. /* code */
  92. sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=5");
  93. break;
  94. default:
  95. break;
  96. }
  97. MX_FEED_IWDG();
  98. HAL_UART_Transmit(&huart4, (uint8_t *)&Sendbuf,86, 0xffff);//huart1需要根据你的配置修改
  99. (*cmd) = 0;
  100. }

在编程的时候,遇到一个问题,我使用sprintf函数转存要发送的字符串,sprintf输出双引号的时候,要加“\”如下

  1. case 8://打开工业物联网云端口
  2. /* code */
  3. sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTOPEN=0,\"www.sukon-cloud.com\",9006");
  4. break;

遇到一个BUG

我选用了速控云的物联网平台,往平台上上传数据。

平台的教程后面再说,看我心情和时间想不想写。

发送如下指令后,

AT+QMTPUBEX=0,0,0,0,"sys/device/SMETTest/variant_data",85

 再次发送

{"type":"variant_data","version":"1.0","time":1638766638000,"params":{"UAV":220.9}}

 服务器收到的总是HEX数据   一堆00000003241234124  然后一堆数字

经过排查发现,我发送的时候,为了方便,没有计算当前AT指令的长度。每次发送都是发送  固定长度字节的数据(长于当前AT指令的总长度) 

  1. HAL_UART_Transmit(&huart4, (uint8_t *)&Sendbuf,EC20_SEND_BUFF_SIZE, 0xffff);
  2. //EC20_SEND_BUFF_SIZE 为 150

而AT+QMTPUBEX= 指令之后模块会回复  >  然后用户输入要发送的数据,因为我多发了很多 00  导致服务器收到了很多0000  然后整条报文都被识别为hex报文。

AT+QMTPUBEX=0,0,0,0,"sys/device/SMETTest/variant_data",85

修改:  按实际发送大小发送,确保 AT+QMTPUBEX= 指令之后不能发一些无关的字符。

修改后,可以顺利上传平台了。

  1. sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTPUBEX=0,0,0,0,\"sys/device/SMETTest/variant_data\",85");
  2. gu16_len = strlen(Sendbuf);
  3. MX_FEED_IWDG();
  4. HAL_UART_Transmit(&huart4, (uint8_t *)&Sendbuf,61, 0xffff);//huart1需要根据你的配置修改

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/602266
推荐阅读
相关标签
  

闽ICP备14008679号