前言
承接上文WIFI上位機部分:【上位機】通過WIFI上位機與網(wǎng)絡(luò)調(diào)試助手通信繪制曲線,現(xiàn)階段實現(xiàn)了STM32單片機與ESP8266WIFI模塊作為下位機與WIFI上位機通信。
一、ESP8266模塊與STM32連接
ATK-ESP8266 是 ALIENTEK 推出的一款高性能的 UART-WiFi(串口-無線)模塊,此處使用的是正點原子團隊自主開發(fā)的ATK-ESP-01模塊。該模塊通過串口與單片機(此處使用啟明欣欣的STM32F407ZGT6)進行通信,只需連接四個引腳,使用十分方便。
在與單片機使用前,建議先連接電腦,使用串口調(diào)試助手與網(wǎng)絡(luò)調(diào)試助手進行互相通信的測試,確保WIFI模塊的正常及網(wǎng)絡(luò)的連通。參考教程:ESP8266模塊使用教程
測試完畢后,可與單片機串口連接,如下所示:
二、單片機代碼
對于ESP8266的使用,其本質(zhì)是使用串口發(fā)送AT指令操縱模塊,可參考:AT指令集,故只需熟悉基本指令,便可編寫相關(guān)代碼。以下是部分操作指令:
#include "esp8266.hpp"
using namespace ESP8266_Space;
extern "C" void MineMain(void)
{
char buf[339];
wifi.init();
HAL_Delay(100);
//wifi.sendCmd("AT+RESTORE", "ODDK", 60000);
//wifi.sendCmd("AT+CWMODE=1", "OK" , 100); //切換到STA模式
//wifi.sendCmd("AT+RST", "OK" , 100); //切換到STA模式
//HAL_Delay(60000);
while(wifi.sendCmd("AT", "OK", 100) == Timeout){
wifi.quitTrans(); //退出透傳
}
wifi.sendCmd("ATE0" , "OK" , 100); //關(guān)閉回顯
//wifi.sendCmd("AT+CWLAP", "OK" , 5000); //顯示可加入的AP
/* 加入wifi */
sprintf(buf,"AT+CWJAP=\"%s\",\"%s\"","dxxy16-403-1","1234567890");
wifi.sendCmd(buf, "WIFI GOT IP", 15000); //加入AP
wifi.send((char*)"", "OK" , 2000); //加入AP
/* 與PC機建立連接 */
sprintf(buf,"AT+CIPSTART=\"%s\",\"%s\",%s", "TCP","192.168.0.171","8086");
wifi.sendCmd(buf, "OK", 15000);
/* 進入透傳模式 */
//wifi.sendCmd("AT+CIPMODE=1", "OK", 200); //開啟透傳模式
//wifi.sendCmd("AT+CIPSEND" , ">", 100); //進入透傳
for(;;){
static char messa[339] = "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40|"\
"1,1,1,0.994,0.993,0.991,0.889,0.875,0.866,0.850,0.838,0.816,0.806,0.789,0.775,0.759,0.745,0.739,0.724,0.715,0.710,0.689,0.667,"\
"0.658,0.645,0.635,0.626,0.598,0.578,0.568,0.559,0.496,0.481,0.472,0.452,0.435,0.418,0.406,0.389,0.377";
sprintf(buf,"%s\r\n",messa);
HAL_Delay(500);
//非透傳
wifi.sendCmd("AT+CIPSEND=676",">",100); //將要發(fā)送676個數(shù)據(jù)
wifi.send(buf, "SEND OK", 100);
//透傳模式
//wifi.sendNoAck((uint8_t *)buf);
}
}
這里使用了模塊的STA模式,即WIFI模塊作為一個客戶端(Client)與WIFI上位機(Server)通信,原理與上一篇文章相似。只需要更改相應(yīng)的指令,就可切換至AT或AT/STA模式,但AT模式與STA模式的使用方法稍有不同(AT模式時模塊作為服務(wù)端)。我們使用一個char型數(shù)組將所要發(fā)送的消息存儲起來,注意格式與上位機所規(guī)定的協(xié)議保持一致。
使用另外一個串口將單片機與電腦相連,好處是能夠觀察WIFI模塊是否已連接且正常工作:
#include "esp8266.hpp"
#include "string.h"
extern DMA_HandleTypeDef hdma_usart6_rx;//使用了串口的DMA,usart6與電腦相連
CPP_UART test_uart = CPP_UART(&huart3);
ESP8266 wifi = ESP8266(&huart6, &hdma_usart6_rx, &htim6);
/**
* @brief ESP8266 類 構(gòu)造函數(shù)
* @param huart : 連接ESP8266所用到的串口
* @param dma_rx : 串口接收對應(yīng)的DMA
* @param htim : 用于計數(shù)是否超時的定時器
* @note huart 對應(yīng)的串口配置要求正確,波特率用默認的115200(也可自己更改,
* @ 但要注意ESP8266本身接收串口的速率),并且需要打開中斷
* @ dma_rx 串口設(shè)置dma的接收,一次一個字節(jié),循環(huán)模式(circle)
* @ htim 不用開啟定時器中斷,不用關(guān)心預(yù)分頻系數(shù)和自動重裝載值和OnePulse模式
* @retval None
**/
ESP8266::ESP8266(UART_HandleTypeDef* huart, DMA_HandleTypeDef *dma_rx, TIM_HandleTypeDef *htim)
:uart(huart)
{
this->dma_rx = dma_rx;
this->tim = htim;
this->uart_state = Idle;
this->mode = NOINIT;
}
完整源碼:ESP8266模塊使用代碼(基于C++)
這里可能出現(xiàn)的問題是可能會連接不上或者出現(xiàn)busy提示,此時重啟一下模塊并重新連接。程序燒錄后執(zhí)行效果如下:文章來源:http://www.zghlxwxcb.cn/news/detail-449112.html
三、總結(jié)
單片機數(shù)據(jù)通過串口發(fā)送給WIFI模塊,WIFI模塊通過無線通信方式發(fā)送至電腦上位機,實現(xiàn)了基本的物聯(lián)網(wǎng)功能,此處展示的僅為一個簡單的測試。文章來源地址http://www.zghlxwxcb.cn/news/detail-449112.html
到了這里,關(guān)于【上位機與下位機通信】使用WIFI模塊ESP8266連接單片機與上位機通信的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!