首先推薦中國移動的代碼,我覺得中國移動的代碼更為合理:(但是有一些其他的模塊在里面)
OneNET開發(fā)板代碼、資料--2020-09-27--標(biāo)準(zhǔn)板、Mini板bug修復(fù) - 開發(fā)板專區(qū) - OneNET設(shè)備云論壇 (10086.cn)
以及這位b站up做的視頻:(wifi模塊在p9節(jié))
【挽救小白第一季】STM32+8266+小程序智能家居畢設(shè)實(shí)戰(zhàn)_嗶哩嗶哩_bilibili
推薦跟著這位up一起c+v。但是沒有講解原理,只追求做出來的可以看看。
---------------------------------------------------------------------------------------------------------------------------------
esp8266是一款wifi無線通訊模塊,該模塊能夠通過wifi來與其他設(shè)備通信。我們要做的就是通過串口來發(fā)送指令、接收指令,其他的都是由模塊自身來處理的。
我所用的是這塊新大陸的wifi模塊,就是由普通的esp8266集成的,用法沒什么區(qū)別。串口與stm32單片機(jī)的串口對接就行,rx-tx交叉接線。由板子3.3v供電。
這里選擇j6端。
啟動和下載選著啟動,這個(gè)下載是在固件庫燒錄的時(shí)候用的。
?當(dāng)然如果你選擇其他的wifi模塊也是一樣的,連接串口電源一樣能用,沒有什么區(qū)別。
其實(shí)這個(gè)東西很簡單,就是一個(gè)串口接收發(fā)的事。
-------------------------------------------------------------------------------------------------------------------------
那么這個(gè)東西該如何使用呢?
我們通過AT指令來操作這個(gè)模塊。通過串口發(fā)送字符串來發(fā)送AT操作指令,這個(gè)模塊會解析指令來實(shí)現(xiàn)操作,并且反饋一些信息。(MQTT協(xié)議)
下面這個(gè)連接是AT指令集:(左邊欄目選擇wifi指令集,基礎(chǔ)指令啥得也都能用)
推薦自己去看看,這些指令我是講不完的,學(xué)會讀文檔是一個(gè)很重要的技能!
Wi-Fi AT 命令集 - ESP32 - — ESP-AT 用戶指南 latest 文檔 (espressif.cohttps://docs.espressif.com/projects/esp-at/zh_CN/latest/esp32/AT_Command_Set/Wi-Fi_AT_Commands.html
我也來講解一下一些指令,方便各位理解:
1.AT+CWMODE
AT+CWMODE=<mode>[,<auto_connect>]
-
<mode>:模式
-
0: 無 Wi-Fi 模式,并且關(guān)閉 Wi-Fi RF
-
1: Station 模式? ?\\該模式是連接wifi的模式,作為客機(jī)
-
2: SoftAP 模式? ?\\該模式是將esp8266成為熱點(diǎn)的模式,選擇2
-
3: SoftAP+Station 模式? \\這個(gè)我也沒有用過估計(jì)是兩個(gè)都有
-
我們一般選擇1模式連接別的熱點(diǎn)或wifi進(jìn)行通信。當(dāng)你要設(shè)置這個(gè)模式的時(shí)候就得一字符串的形式發(fā)給模塊,如下
? ? ? ? ? ? ?"AT+CIPMODE=1\r\n"? ? ?!??!注意必須要有\(zhòng)r\n,這是規(guī)定,否則指令識別不了
wifi模塊自己會讀取設(shè)別設(shè)置模式,收到并且發(fā)送的指令正確后會返回“OK”,否則會返回“ERROR”。
?2.AT+CWJAP
AT+CWJAP=[<ssid>],[<pwd>][,<bssid>][,<pci_en>][,<reconn_interval>][,<listen_interval>][,<scan_mode>][,<jap_timeout>][,<pmf>]
這個(gè)指令是用來連接wifi的,看起來一堆,其實(shí)主要的只是前面的ssid和pwd,就是你wifi的名字和密碼,如下
"AT+CWJAP=\"wifiname\",\"password\"\r\n"? ?
?!?。∽⒁獗仨氁衆(zhòng)r\n,這是規(guī)定,否則指令識別不了
在wifiname中輸入你的wifi名字,password中輸入密碼,在輸入上一條指令“AT+CIPMODE=1”后你就能連上你的熱點(diǎn)或者wifi了。當(dāng)然這個(gè)函數(shù)后面還有許多參數(shù),我也沒用過,感興趣的可以去學(xué)學(xué)。AT指令有很多,建議自己去看一看。
然后下面這些指令就是要有MQTT協(xié)議的wifi模塊才能用了!如果報(bào)錯(cuò)就需要你自己去燒錄一下固件庫了。當(dāng)然你不下也可以連接部分服務(wù)器,只不過有MQTT協(xié)議的你可能就連接不了了。普通的服務(wù)器至于要用TCP/IP指令,還有更多指令要自己去看文檔!
// 單連接 (AT+CIPMUX=0): AT+CIPSTART=<"type">,<"remote host">,<remote port>[,<keep_alive>][,<"local IP">] // 多連接 (AT+CIPMUX=1): AT+CIPSTART=<link ID>,<"type">,<"remote host">,<remote port>[,<keep_alive>][,<"local IP">]
4.AT+MQTTUSERCFG
AT+MQTTUSERCFG=<LinkID>,<scheme>,<"client_id">,<"username">,<"password">,<cert_key_ID>,<CA_ID>,<"path">
-
<LinkID>:當(dāng)前僅支持 link ID 0。
-
<scheme>:
-
1: MQTT over TCP;
-
2: MQTT over TLS(不校驗(yàn)證書);
-
3: MQTT over TLS(校驗(yàn) server 證書);
-
4: MQTT over TLS(提供 client 證書);
-
5: MQTT over TLS(校驗(yàn) server 證書并且提供 client 證書);
-
6: MQTT over WebSocket(基于 TCP);
-
7: MQTT over WebSocket Secure(基于 TLS,不校驗(yàn)證書);
-
8: MQTT over WebSocket Secure(基于 TLS,校驗(yàn) server 證書);
-
9: MQTT over WebSocket Secure(基于 TLS,提供 client 證書);
-
10: MQTT over WebSocket Secure(基于 TLS,校驗(yàn) server 證書并且提供 client 證書)。
-
-
<client_id>:MQTT 客戶端 ID,最大長度:256 字節(jié)。
-
<username>:用戶名,用于登陸 MQTT broker,最大長度:64 字節(jié)。
-
<password>:密碼,用于登陸 MQTT broker,最大長度:64 字節(jié)。
-
<cert_key_ID>:證書 ID,目前 ESP-AT 僅支持一套 cert 證書,參數(shù)為 0。
-
<CA_ID>:CA ID,目前 ESP-AT 僅支持一套 CA 證書,參數(shù)為 0。
-
<path>:資源路徑,最大長度:32 字節(jié)
link id填0;scheme填1;client_id隨便填,但不能不填;username和password隨便填。我用的是公共服務(wù)器,沒有用戶名和密碼的要求,如果是專業(yè)的服務(wù)器就有可能要填正確的用戶名和密碼。后面三個(gè)參數(shù)就填0,0和空就行了。如下
="AT+MQTTUSERCFG=0,1,\"sbmc\",\"user\",\"pw\",0,0,\"\"\r\n"
?。?!注意必須要有\(zhòng)r\n,這是規(guī)定,否則指令識別不了
3.AT+MQTTCONN
AT+MQTTCONN=<LinkID>,<"host">,<port>,<reconnect>
-
<LinkID>:當(dāng)前僅支持 link ID 0。
-
<host>:MQTT broker 域名,最大長度:128 字節(jié)。
-
<port>:MQTT broker 端口,最大端口:65535。
-
<reconnect>:
-
0: MQTT 不自動重連。如果 MQTT 建立連接后又?jǐn)嚅_,則無法再次使用本命令重新建立連接,您需要先發(fā)送?AT+MQTTCLEAN=0?命令清理信息,重新配置參數(shù),再建立新的連接。
-
1: MQTT 自動重連,會消耗較多的內(nèi)存資源。
-
linkid填0;host填你連接服務(wù)器的ip地址;port填連接的端口號。reconnect選擇不自動重連。我選擇的是使用emqx創(chuàng)建的服務(wù)器,不會創(chuàng)建服務(wù)器的話我后面可能會寫一篇博客來幫助大家創(chuàng)建服務(wù)器。
4.AT+MQTTSUB
AT+MQTTSUB=<LinkID>,<"topic">,<qos>
-
<LinkID>:當(dāng)前僅支持 link ID 0。
-
<topic>:訂閱的 topic。
-
<qos>:訂閱的 QoS。
linkid為0;topic為訂閱的話題,這個(gè)你可以把他看成是一個(gè)頻道,兩臺設(shè)備只有在同一頻道內(nèi)才能接收到互相發(fā)的消息。qos這個(gè)東西就是確認(rèn)是否收到消息,1級為我發(fā)消息后我要確認(rèn)你收到了,要等到你發(fā)送反饋信息。而0就是我發(fā)給你了就是發(fā)給你了,不管你收沒收到,發(fā)了只后我就不管了。我們填0就行了。
"AT+MQTTSUB=0,\"123\",1\r\n"
?。?!注意必須要有\(zhòng)r\n,這是規(guī)定,否則指令識別不了
5.AT+MQTTPUB
AT+MQTTPUB=<LinkID>,<"topic">,<"data">,<qos>,<retain>
-
<LinkID>:當(dāng)前僅支持 link ID 0。
-
<topic>:MQTT topic,最大長度:128 字節(jié)。
-
<data>:MQTT 字符串消息。
-
<qos>:發(fā)布消息的 QoS,參數(shù)可選 0、1、或 2,默認(rèn)值:0。
-
<retain>:發(fā)布 retain。
topic為訂閱的話題;data為要發(fā)送的數(shù)據(jù);qos和上面一樣。retain填0都行,我并不期待他的反饋。
"AT+MQTTPUB=0,\"123\",\"ON_OK\",1,0\r\n"
?。?!注意必須要有\(zhòng)r\n,這是規(guī)定,否則指令識別不了
最后就是串口初始化了,我就不講了。源碼搞上!
OLED并沒有用上,如果有刪掉就行了
main.c
#include "stm32f10x.h" // Device header
#include "usart.h"
#include "usart3.h"
#include "esp8622.h"
#include "Delay.h"
#include "OLED.h"
u8 *instruction = "";
int main(void){
OLED_Init();
usart_init();
usart3_init();
sendcmd("ATE0","",1); //關(guān)閉回顯
connect_Wifi();
Delay_ms(3000);
connect_Cloud();
while(1){
if(ack_dat("led_on")){
sendcmd("AT+MQTTPUB=0,\"123\",\"ON_OK\",1,0\r\n","",1);//
}
if(ack_dat("led_down")){
sendcmd("AT+MQTTPUB=0,\"123\",\"DOWN_OK\",1,0\r\n","",1);
}
Delay_ms(200);
}
}
usart.c
#include "usart.h"
#if EN_USART1_RX //如果使能了接收
u8 USART_RX_BUF[USART_REC_LEN]; //接收緩沖,最大USART_REC_LEN個(gè)字節(jié).
u16 USART_RX_STA=0; //接收狀態(tài)標(biāo)記
void usart_init(void){
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//tx
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
NVIC_Init(&NVIC_InitStructure);
USART_InitStructure.USART_BaudRate=115200;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
USART_InitStructure.USART_StopBits=USART_StopBits_1;
USART_InitStructure.USART_Parity=USART_Parity_No;
USART_Init(USART1,&USART_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE,ENABLE);
USART_Cmd(USART1,ENABLE);
}
void usart_send(uint8_t Byte){
USART_SendData(USART1, Byte);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == 0);
}
void USART1_IRQHandler(void){
u8 res;
if(USART_GetFlagStatus(USART1, USART_IT_RXNE)!=0){
res = USART_ReceiveData(USART1);
if((USART_RX_STA&0x8000) == 0){
if(USART_RX_STA&0x4000){
if(res!=0x0a)USART_RX_STA=0;
else USART_RX_STA|=0x8000;
}
else{
if(res==0x0d)USART_RX_STA|=0x4000;
else{
USART_RX_BUF[USART_RX_STA&0x3fff]=res;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;
}
}
}
}
}
#endif
//重定義fputc函數(shù)
int fputc(int ch, FILE *f)
{
usart_send(ch);
return ch;
}
usart.h
#ifndef __UASRT_H__
#define __UASRT_H__
#include <stdio.h>
#include "stm32f10x.h"
#define USART_REC_LEN 200 //定義最大接收字節(jié)數(shù) 200
#define EN_USART1_RX 1
extern u8 USART_RX_BUF[USART_REC_LEN]; //接收緩沖,最大USART_REC_LEN個(gè)字節(jié).末字節(jié)為換行符
extern u16 USART_RX_STA;
void usart_init(void);
void usart_send(uint8_t Byte);
#endif
usart3.c
#include "usart3.h"
#include "stdarg.h"
#include "string.h"
#include "OLED.h"
u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; //接收緩沖,最大USART3_MAX_RECV_LEN個(gè)字節(jié).
u8 USART3_TX_BUF[USART3_MAX_SEND_LEN]; //發(fā)送緩沖,最大USART3_MAX_SEND_LEN字節(jié)
vu16 USART3_RX_STA=0;
void usart3_init(void){
NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef usartst;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能USART3,GPIOA時(shí)鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//注意usart3再apb1
//USART3_TX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復(fù)用推挽輸出
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.10
//USART1_RX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PA11
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.11
USART_DeInit(USART3); //復(fù)位串口3
usartst.USART_BaudRate = 115200;
usartst.USART_WordLength = USART_WordLength_8b;
usartst.USART_StopBits = USART_StopBits_1;
usartst.USART_Parity = USART_Parity_No;
usartst.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
usartst.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
USART_Init(USART3,&usartst);
USART_Cmd(USART3,ENABLE);
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//開啟串口接受中斷
NVIC_InitStructure.NVIC_IRQChannel=USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
NVIC_Init(&NVIC_InitStructure);
}
void u3_printf(char* fmt,...)
{
u16 i,j;
va_list ap;
va_start(ap,fmt);
vsprintf((char*)USART3_TX_BUF,fmt,ap);
va_end(ap);
i=strlen((const char*)USART3_TX_BUF); //此次發(fā)送數(shù)據(jù)的長度
for(j=0;j<i;j++) //循環(huán)發(fā)送數(shù)據(jù)
{
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //循環(huán)發(fā)送,直到發(fā)送完畢
USART_SendData(USART3,USART3_TX_BUF[j]);
}
}
void USART3_IRQHandler(void){
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收到數(shù)據(jù)
{
USART_ClearITPendingBit(USART3, USART_IT_RXNE);
USART3_RX_BUF[USART3_RX_STA] = USART_ReceiveData(USART3); //讀取接收到的數(shù)據(jù)
USART3_RX_STA=USART3_RX_STA+1;
if(USART3_RX_STA>USART3_MAX_RECV_LEN)//緩存區(qū)溢出
USART3_RX_STA = 0x0000;
}
}
usart3.h
#ifndef __USART3_H__
#define __USART3_H__
#include "stm32f10x.h"
#include <stdio.h>
#define USART3_MAX_RECV_LEN 1024 //最大接收緩存字節(jié)數(shù)
#define USART3_MAX_SEND_LEN 600 //最大發(fā)送緩存字節(jié)數(shù);
extern u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; //接收緩沖,最大USART3_MAX_RECV_LEN字節(jié)
extern u8 USART3_TX_BUF[USART3_MAX_SEND_LEN]; //發(fā)送緩沖,最大USART3_MAX_SEND_LEN字節(jié)
extern vu16 USART3_RX_STA; //接收數(shù)據(jù)狀態(tài)
void usart3_init(void);
#endif
esp8266.c
#include "esp8622.h"
//當(dāng)你已經(jīng)連上服務(wù)器地址后,再次下載需要重新啟動esp8266模塊,否則連接到服務(wù)器的指令會報(bào)錯(cuò)
//推薦視頻,用的是中國移動的代碼
//https://www.bilibili.com/video/BV1ae411W7yD/?spm_id_from=333.999.0.0
//MQTT指令集
//https://docs.espressif.com/projects/esp-at/zh_CN/latest/esp32/AT_Command_Set/MQTT_AT_Commands.html#cmd-mqttsub
//esp固件庫燒錄
//https://www.bilibili.com/read/cv18483671
//https://www.bilibili.com/video/BV1Mx4y1P72o/?spm_id_from=333.337.search-card.all.click
/* 發(fā)送指令
AT+MQTTPUB:發(fā)布 MQTT 消息(字符串)?
設(shè)置命令?
功能:
通過 topic 發(fā)布 MQTT 字符串 消息。如果您發(fā)布消息的數(shù)據(jù)量相對較多,已經(jīng)超過了單條 AT 指令的長度閾值 256 字節(jié),請使用 AT+MQTTPUBRAW 命令。
命令:
AT+MQTTPUB=<LinkID>,<"topic">,<"data">,<qos>,<retain>
響應(yīng):
OK
參數(shù)?
<LinkID>:當(dāng)前僅支持 link ID 0。
<topic>:MQTT topic,最大長度:128 字節(jié)。
<data>:MQTT 字符串消息。
<qos>:發(fā)布消息的 QoS,參數(shù)可選 0、1、或 2,默認(rèn)值:0。
<retain>:發(fā)布 retain。
說明?
每條 AT 命令的總長度不能超過 256 字節(jié)。
本命令不能發(fā)送數(shù)據(jù) \0,若需要發(fā)送該數(shù)據(jù),請使用 AT+MQTTPUBRAW 命令。
示例?
AT+CWMODE=1
AT+CWJAP="ssid","password"
AT+MQTTUSERCFG=0,1,"ESP32","espressif","1234567890",0,0,""
AT+MQTTCONN=0,"192.168.10.234",1883,0
AT+MQTTPUB=0,"topic","\"{\"timestamp\":\"20201121085253\"}\"",0,0 // 發(fā)送此命令時(shí),請注意特殊字符是否需要轉(zhuǎn)義。
*/
//從串口3響應(yīng)接收,如果接收到了則會返回接收到的數(shù)據(jù)。
u8 AT_Respose(u8 *string)
{
printf("\r\n接收到模塊響應(yīng)數(shù)據(jù)為:\n%s",USART3_RX_BUF);
if(strstr((const char*)USART3_RX_BUF,(const char*)string) != 0)
{
printf("\r\n接收到期待的響應(yīng) %s",string);
USART3_RX_STA = 0;
memset(USART3_RX_BUF,0x00,USART3_MAX_RECV_LEN);
return 1;
}
else
{
printf("\r\n未接收到期待的響應(yīng) %s",string);
USART3_RX_STA = 0;
memset(USART3_RX_BUF,0x00,USART3_MAX_RECV_LEN);
return 0;
}
}
//發(fā)送數(shù)據(jù),通過串口3發(fā)送AT指令,esp8266會自行根據(jù)指令來傳輸數(shù)據(jù)
u8 sendcmd(u8 *cmd,u8 *ack,u8 times)//cmd:傳輸?shù)闹噶?ack:期待收到的響應(yīng) times:失敗后再次發(fā)送的次數(shù)
{
u8 i;
for(i=0;i<times;i++)
{
u3_printf("%s\r\n",cmd);//串口三輸出
printf("\r\n已發(fā)送指令:%s",cmd);//串口一輸出,提示程序的進(jìn)程
Delay_ms(1000);//等待響應(yīng)
if(AT_Respose(ack))
return 1;
printf("\r\n發(fā)送指令響應(yīng)錯(cuò)誤,1.5s后重新發(fā)送指令:%s",cmd);
Delay_ms(1500);
}
return 0;
}
u8 sendcmd1(u8 *cmd,u8 *ack,u8 times)//發(fā)送數(shù)據(jù)特殊版,一般不用
{
u8 i;
for(i=0;i<times;i++)
{
u3_printf("%s\r\n",cmd);
printf("\r\n已發(fā)送指令:%s",cmd);
Delay_ms(7000);
if(AT_Respose(ack))
return 1;
printf("\r\n發(fā)送指令響應(yīng)錯(cuò)誤,1.5s后重新發(fā)送指令:%s",cmd);
Delay_ms(1500);
}
return 0;
}
//連接wifi AT+XXX 的格式是固定的
u8 connect_Wifi(void)
{
u8 *instruction="AT";
if(sendcmd(instruction,"OK",3))//檢測wifi模塊是否正常
{
Delay_ms(1000);
instruction="AT+CIPMODE=1";
if(sendcmd(instruction,"OK",3))//設(shè)置為sta模式
{
Delay_ms(1000);
instruction="AT+CWJAP=\"Lakzhu\",\"1588662051\"";
if(sendcmd1(instruction,"OK",5))//連接wifi熱點(diǎn)
{
return 1;
}
}
}
return 0;
}
//連接云平臺服務(wù)器
u8 connect_Cloud(void)
{
u8 *instruction = "";
instruction="AT+MQTTUSERCFG=0,1,\"sbmc\",\"user\",\"pw\",0,0,\"\""; //發(fā)送連接后的自己的id,用戶名,密碼 id不能為空
if(sendcmd(instruction,"OK",3)){
instruction="AT+MQTTCONN=0,\"192.168.109.71\",1883,0"; //連接服務(wù)器的地址、通道
if(sendcmd(instruction,"OK",3)){
instruction="AT+MQTTSUB=0,\"123\",1\r\n"; //訂閱話題
if(sendcmd(instruction,"OK",3)){
return 1;
}
}
}
return 0;
}
int ack_dat(u8* string){
if(strstr((const char*)USART3_RX_BUF,(const char*)string) != 0)
{
printf("\r\n接收到期待的響應(yīng) %s",string);
USART3_RX_STA = 0;
memset(USART3_RX_BUF,0x00,USART3_MAX_RECV_LEN);
return 1;
}
return 0;
}
esp8266.h
#ifndef __ESP8622_H__
#define __ESP8622_H__
#include "Delay.h"
#include "usart.h"
#include "usart3.h"
#include "stm32f10x.h"
#include "string.h"
//WiFi連接
//云平臺連接
//數(shù)據(jù)上傳
//命令上傳
u8 sendcmd(u8 *cmd,u8 *ack,u8 times);
u8 connect_Wifi(void);
u8 connect_Cloud(void);
int ack_dat(u8* string);
#endif
Delay.c
#include "Delay.h"
/**
* @brief 微秒級延時(shí)
* @param xus 延時(shí)時(shí)長,范圍:0~233015
* @retval 無
*/
void Delay_us(uint32_t xus)
{
SysTick->LOAD = 72 * xus; //設(shè)置定時(shí)器重裝值
SysTick->VAL = 0x00; //清空當(dāng)前計(jì)數(shù)值
SysTick->CTRL = 0x00000005; //設(shè)置時(shí)鐘源為HCLK,啟動定時(shí)器
while(!(SysTick->CTRL & 0x00010000)); //等待計(jì)數(shù)到0
SysTick->CTRL = 0x00000004; //關(guān)閉定時(shí)器
}
/**
* @brief 毫秒級延時(shí)
* @param xms 延時(shí)時(shí)長,范圍:0~4294967295
* @retval 無
*/
void Delay_ms(uint32_t xms)
{
while(xms--)
{
Delay_us(1000);
}
}
/**
* @brief 秒級延時(shí)
* @param xs 延時(shí)時(shí)長,范圍:0~4294967295
* @retval 無
*/
void Delay_s(uint32_t xs)
{
while(xs--)
{
Delay_ms(1000);
}
}
Delay.h文章來源:http://www.zghlxwxcb.cn/news/detail-718642.html
#ifndef __DELAY_H
#define __DELAY_H
#include "stm32f10x.h"
void Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);
#endif
分享就到這里。感謝觀看。文章來源地址http://www.zghlxwxcb.cn/news/detail-718642.html
到了這里,關(guān)于esp8266模塊--MQTT協(xié)議連接服務(wù)器實(shí)現(xiàn)數(shù)據(jù)接收和發(fā)送+源碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!