赞
踩
硬件:STM32F091CBT6 、EC200N-CN模块板 、USB-TTL串口助手
软件:VS CODE 、 STM32CUBEMX、IAR 8.32
连接好EC200N-CN模块和单片机主板。
EC200N-CN模块设计时注意供电和IO电平转换。
EC200N-CN是低功耗的,其主串口用的是1.8V电压域的,一般使用的STM32F0系列单片机IO口是3.3V电平的,两者连接的时候需要电平转换。
电平转换在EC200N的硬件设计手册里有电路图。
我这边设计的EC200N-CN模块预留了
PWRKEY(模块开关机引脚)
RESET_N(模块复位引脚)
主串口-RXD
主串口-TXD引脚。
基本这几个引脚就够一般的物联网应用使用了。
上电后,PWKEY引脚一定要低电平才行,低电平才能打开模块,否则模块不开机收不到AT指令,一开始犯了这个错误,因为模块自己印出来的PWKEY通过三极管做了反向处理,理解错了开机电平,导致模块一直不开机。
和单片机通讯时,单片机这边因为电平转换要加上拉电阻。
如果没有上拉电阻,两者无法通讯。
EC200N-CN和STM32F091CB 串口通讯故障排查。
即使加了上拉电阻后,任然存在一个BUG。
后面才解决掉。
配置好单片机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}} | 在收到>后发送保文数据。 |
1、AT
说明: 检测AT指令收发是否正常
模组收到指令回复:
- AT
- OK
2、AT+CPIN?
说明: 查询SIM卡状态(是否插入SIM卡、锁定SIM卡、解锁SIM卡),返回 READY则表示模组正常
模组收到指令回复:
- AT+CPIN?
- +CPIN: READY
-
- OK
3、AT+CREG?
说明: 查询当前网络注册状态,正常则回复 +CREG: 0,1
模组收到指令回复:
- AT+CREG?
- +CREG: 0,1
-
- OK
4、AT+CEREG?
说明: 查询当前EPS网络注册状态,正常则回复 +CEREG: 0,1
模组收到指令回复:
- AT+CEREG?
- +CEREG: 0,1
-
- OK
5.AT+QMTCFG="recv/mode",0,0,1
模组收到指令回复:
- AT+QMTCFG="recv/mode",0,0,1
- OK
6.AT+QMTOPEN=0,"www.sukon-cloud.com",9006
模组收到指令回复:
- 00> AT+QMTOPEN=0,"www.sukon-cloud.com",9006
- 00>
- 00> OK
- 00>
- 00> +QMTOPEN: 0,0
7.AT+QMTCONN=0,"SMETTest","SMETTest","123456"
模组收到指令回复:
- 00> AT+QMTCONN=0,"SMETTest","SMETTest","123456"
- 00>
- 00> OK
- 00>
- 00> +QMTCONN: 0,0,0
8.AT+QMTPUBEX
AT+QMTPUBEX=0,0,0,0,"sys/device/SMETTest/variant_data",85
模组收到指令回复:
- 00> AT+QMTPUBEX=0,0,0,0,"sys/device/SMETTest/variant_data",85
- 00>
- 00> >
模组收到指令回复:
9.{"type":"variant_data","version":"1.0","time":1638766638000,"params":{"UAV":220.9}}
模组收到指令回复:
- 00> > {"type":"variant_data","version":"1.0","time":1638766638000,"params":{"UAV":220.5}}
- 00>
- 00> OK
测试程序:
- char Sendbuf[EC20_SEND_BUFF_SIZE];
- ErrorStatus F_TestEC200N(uint8_t *cmd)
- {
- // scanf("%s",buf);
-
- uint8_t lu8_cmd =0;
- lu8_cmd = (uint8_t)(*cmd);
- memset(&Sendbuf[0],0x00,EC20_SEND_BUFF_SIZE);
- // sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CPIN?");
-
- switch (lu8_cmd)
- {
- case 0:
- return 1;
- break;
- case 1:
- /* code */
- sprintf((char*)&Sendbuf[0],"%s\r\n","AT");
- break;
- case 2:
- /* code */
- sprintf((char*)&Sendbuf[0],"%s\r\n","ATI");
- break;
- case 3://查询SIM卡
- /* code */
- sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CPIN?");
- break;
- case 4://查询信号,31最大,小于10证明信号超级不好
- /* code */
- sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CSQ");
- break;
- case 5://查询PS注册情况,注册则返回1,证明获取IP,可以进行网络使用啦
- /* code */
- sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CGREG?");
- break;
- case 6://附着网络是否成功
- /* code */
- sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CGATT?");
- break;
- case 7://设置数据格式
- /* code */
- sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTCFG=\"recv/mode\",0,0,1");
- break;
-
- case 8://打开工业物联网云端口
- /* code */
- sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTOPEN=0,\"www.sukon-cloud.com\",9006");
- break;
-
- case 9://这步执行成功后,设备应该在线了。
- /* code */
- sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTCONN=0,\"SMETTest\",\"SMETTest\",\"123456\"");
- break;
- case 10://发送数据命令
- /* code */
- sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTPUBEX=0,0,0,0,\"sys/device/SMETTest/variant_data\",85");
- gu16_len = strlen(Sendbuf);
- MX_FEED_IWDG();
- HAL_UART_Transmit(&huart4, (uint8_t *)&Sendbuf,61, 0xffff);//huart1需要根据你的配置修改
- MX_FEED_IWDG();
- MX_FEED_IWDG();
- HAL_Delay(800);
-
- memset(&Sendbuf[0],0x00,EC20_SEND_BUFF_SIZE);
- sprintf((char*)&Sendbuf[0],"%s\r\n","{\"type\":\"variant_data\",\"version\":\"1.0\",\"time\":1638766638000,\"params\":{\"UAV\":220.5}}");
- gu16_len = strlen(Sendbuf);
- HAL_UART_Transmit(&huart4, (uint8_t *)&Sendbuf,87, 0xffff);//huart1需要根据你的配置修改
- (*cmd) = 0;
- return 1;
- break;
- case 11://Paload数据
- /* code */
- sprintf((char*)&Sendbuf[0],"%s\r\n","{\"type\":\"variant_data\",\"version\":\"1.0\",\"time\":1638766638000,\"params\":{\"UAV\":220.5}}");
- break;
-
- case 20://清除链接
- /* code */
- sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=0");
- break;
-
- case 21://清除链接
- /* code */
- sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=1");
- break;
-
- case 22://清除链接
- /* code */
- sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=2");
- break;
-
- case 23://清除链接
- /* code */
- sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=3");
- break;
-
- case 24://清除链接
- /* code */
- sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=4");
- break;
-
- case 25://清除链接
- /* code */
- sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=5");
- break;
-
- default:
- break;
- }
- MX_FEED_IWDG();
- HAL_UART_Transmit(&huart4, (uint8_t *)&Sendbuf,86, 0xffff);//huart1需要根据你的配置修改
- (*cmd) = 0;
- }
在编程的时候,遇到一个问题,我使用sprintf函数转存要发送的字符串,sprintf输出双引号的时候,要加“\”如下
- case 8://打开工业物联网云端口
- /* code */
- sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTOPEN=0,\"www.sukon-cloud.com\",9006");
- 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指令的总长度)
- HAL_UART_Transmit(&huart4, (uint8_t *)&Sendbuf,EC20_SEND_BUFF_SIZE, 0xffff);
- //EC20_SEND_BUFF_SIZE 为 150
而AT+QMTPUBEX= 指令之后模块会回复 > 然后用户输入要发送的数据,因为我多发了很多 00 导致服务器收到了很多0000 然后整条报文都被识别为hex报文。
AT+QMTPUBEX=0,0,0,0,"sys/device/SMETTest/variant_data",85
修改: 按实际发送大小发送,确保 AT+QMTPUBEX= 指令之后不能发一些无关的字符。
修改后,可以顺利上传平台了。
- sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTPUBEX=0,0,0,0,\"sys/device/SMETTest/variant_data\",85");
- gu16_len = strlen(Sendbuf);
- MX_FEED_IWDG();
- HAL_UART_Transmit(&huart4, (uint8_t *)&Sendbuf,61, 0xffff);//huart1需要根据你的配置修改
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。