開發(fā)環(huán)境
硬件:STM32F091CBT6 、EC200N-CN模塊板 、USB-TTL串口助手
軟件:VS CODE? 、 STM32CUBEMX、IAR 8.32
1.硬件設(shè)計(jì)
連接好EC200N-CN模塊和單片機(jī)主板。
EC200N-CN模塊設(shè)計(jì)時(shí)注意供電和IO電平轉(zhuǎn)換。
EC200N-CN是低功耗的,其主串口用的是1.8V電壓域的,一般使用的STM32F0系列單片機(jī)IO口是3.3V電平的,兩者連接的時(shí)候需要電平轉(zhuǎn)換。
電平轉(zhuǎn)換在EC200N的硬件設(shè)計(jì)手冊(cè)里有電路圖。
我這邊設(shè)計(jì)的EC200N-CN模塊預(yù)留了
PWRKEY(模塊開關(guān)機(jī)引腳)
RESET_N(模塊復(fù)位引腳)
主串口-RXD
主串口-TXD引腳。
基本這幾個(gè)引腳就夠一般的物聯(lián)網(wǎng)應(yīng)用使用了。
注意注意:
我遇到的大坑1:
上電后,PWKEY引腳一定要低電平才行,低電平才能打開模塊,否則模塊不開機(jī)收不到AT指令,一開始犯了這個(gè)錯(cuò)誤,因?yàn)槟K自己印出來的PWKEY通過三極管做了反向處理,理解錯(cuò)了開機(jī)電平,導(dǎo)致模塊一直不開機(jī)。
我遇到的大坑2:
和單片機(jī)通訊時(shí),單片機(jī)這邊因?yàn)殡娖睫D(zhuǎn)換要加上拉電阻。
如果沒有上拉電阻,兩者無法通訊。
EC200N-CN和STM32F091CB 串口通訊故障排查。
即使加了上拉電阻后,任然存在一個(gè)BUG。
后面才解決掉。
2.程序編寫
配置好單片機(jī)IO口的串口模塊、波特率,然后就直接發(fā)送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 | 鏈接物聯(lián)網(wǎng)平臺(tái) |
AT+QMTCONN=0,"SMETTest","SMETTest","123456" | 登錄平臺(tái) |
AT+QMTPUBEX=0,0,0,0,"sys/device/SMETTest/variant_data",85 | 發(fā)布MQTT消息 |
{"type":"variant_data","version":"1.0","time":1638766638000,"params":{"UAV":220.9}} | 在收到>后發(fā)送保文數(shù)據(jù)。 |
常用AT指令說明
1、AT
說明: 檢測(cè)AT指令收發(fā)是否正常
模組收到指令回復(fù):
AT
OK
2、AT+CPIN?
說明: 查詢SIM卡狀態(tài)(是否插入SIM卡、鎖定SIM卡、解鎖SIM卡),返回 READY則表示模組正常
模組收到指令回復(fù):
AT+CPIN?
+CPIN: READY
OK
3、AT+CREG?
說明: 查詢當(dāng)前網(wǎng)絡(luò)注冊(cè)狀態(tài),正常則回復(fù) +CREG: 0,1
模組收到指令回復(fù):
AT+CREG?
+CREG: 0,1
OK
4、AT+CEREG?
說明: 查詢當(dāng)前EPS網(wǎng)絡(luò)注冊(cè)狀態(tài),正常則回復(fù) +CEREG: 0,1
模組收到指令回復(fù):
AT+CEREG?
+CEREG: 0,1
OK
5.AT+QMTCFG="recv/mode",0,0,1
模組收到指令回復(fù):
AT+QMTCFG="recv/mode",0,0,1
OK
6.AT+QMTOPEN=0,"www.sukon-cloud.com",9006
模組收到指令回復(fù):
00> AT+QMTOPEN=0,"www.sukon-cloud.com",9006
00>
00> OK
00>
00> +QMTOPEN: 0,0
7.AT+QMTCONN=0,"SMETTest","SMETTest","123456"
模組收到指令回復(fù):
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
模組收到指令回復(fù):
00> AT+QMTPUBEX=0,0,0,0,"sys/device/SMETTest/variant_data",85
00>
00> >
模組收到指令回復(fù):
9.{"type":"variant_data","version":"1.0","time":1638766638000,"params":{"UAV":220.9}}
模組收到指令回復(fù):
00> > {"type":"variant_data","version":"1.0","time":1638766638000,"params":{"UAV":220.5}}
00>
00> OK
測(cè)試程序:
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://查詢信號(hào),31最大,小于10證明信號(hào)超級(jí)不好
/* code */
sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CSQ");
break;
case 5://查詢PS注冊(cè)情況,注冊(cè)則返回1,證明獲取IP,可以進(jìn)行網(wǎng)絡(luò)使用啦
/* code */
sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CGREG?");
break;
case 6://附著網(wǎng)絡(luò)是否成功
/* code */
sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CGATT?");
break;
case 7://設(shè)置數(shù)據(jù)格式
/* code */
sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTCFG=\"recv/mode\",0,0,1");
break;
case 8://打開工業(yè)物聯(lián)網(wǎng)云端口
/* code */
sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTOPEN=0,\"www.sukon-cloud.com\",9006");
break;
case 9://這步執(zhí)行成功后,設(shè)備應(yīng)該在線了。
/* code */
sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTCONN=0,\"SMETTest\",\"SMETTest\",\"123456\"");
break;
case 10://發(fā)送數(shù)據(jù)命令
/* 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需要根據(jù)你的配置修改
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需要根據(jù)你的配置修改
(*cmd) = 0;
return 1;
break;
case 11://Paload數(shù)據(jù)
/* 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需要根據(jù)你的配置修改
(*cmd) = 0;
}
在編程的時(shí)候,遇到一個(gè)問題,我使用sprintf函數(shù)轉(zhuǎn)存要發(fā)送的字符串,sprintf輸出雙引號(hào)的時(shí)候,要加“\”如下
case 8://打開工業(yè)物聯(lián)網(wǎng)云端口
/* code */
sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTOPEN=0,\"www.sukon-cloud.com\",9006");
break;
遇到一個(gè)BUG
我選用了速控云的物聯(lián)網(wǎng)平臺(tái),往平臺(tái)上上傳數(shù)據(jù)。
平臺(tái)的教程后面再說,看我心情和時(shí)間想不想寫。
發(fā)送如下指令后,
AT+QMTPUBEX=0,0,0,0,"sys/device/SMETTest/variant_data",85
?再次發(fā)送
{"type":"variant_data","version":"1.0","time":1638766638000,"params":{"UAV":220.9}}
?服務(wù)器收到的總是HEX數(shù)據(jù)? ?一堆00000003241234124? 然后一堆數(shù)字
經(jīng)過排查發(fā)現(xiàn),我發(fā)送的時(shí)候,為了方便,沒有計(jì)算當(dāng)前AT指令的長(zhǎng)度。每次發(fā)送都是發(fā)送? 固定長(zhǎng)度字節(jié)的數(shù)據(jù)(長(zhǎng)于當(dāng)前AT指令的總長(zhǎng)度)?
HAL_UART_Transmit(&huart4, (uint8_t *)&Sendbuf,EC20_SEND_BUFF_SIZE, 0xffff);
//EC20_SEND_BUFF_SIZE 為 150
而AT+QMTPUBEX= 指令之后模塊會(huì)回復(fù)? >? 然后用戶輸入要發(fā)送的數(shù)據(jù),因?yàn)槲叶喟l(fā)了很多 00? 導(dǎo)致服務(wù)器收到了很多0000? 然后整條報(bào)文都被識(shí)別為hex報(bào)文。
AT+QMTPUBEX=0,0,0,0,"sys/device/SMETTest/variant_data",85
修改:? 按實(shí)際發(fā)送大小發(fā)送,確保?AT+QMTPUBEX= 指令之后不能發(fā)一些無關(guān)的字符。文章來源:http://www.zghlxwxcb.cn/news/detail-685640.html
修改后,可以順利上傳平臺(tái)了。文章來源地址http://www.zghlxwxcb.cn/news/detail-685640.html
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需要根據(jù)你的配置修改
到了這里,關(guān)于STM32 EC200N-CN MQTT鏈接服務(wù)器開發(fā)實(shí)錄的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!