基于STM32F407的WIFI通信(使用的是ESP8266模塊)
本次做的是WIFI通信所實作的功能是:由單片機端向客戶端發送資料,模式:STA模式(及連接路由器的方式),(所實作的功能比較簡單,只是單方向發送,測驗5次,每次均成功,非常穩定,代碼也非常簡潔),廢話不多說,直接上代碼,
(本次上傳的代碼對于比較懂的仁兄已經夠用,如果還有仁兄想要參考完整的原始碼,可加我微信:wpt666aaa 或QQ:2036795517),這個很方便的,
主要代碼
主函式部分:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "usmart.h"
#include "usart3.h"
#include "common.h"
#include "esp8266.h"
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設定系統中斷優先級分組2
delay_init(168); //初始化延時函式
uart_init(115200); //初始化串口波特率為115200
usart3_init(115200); //初始化串口3波特率為115200
esp8266_start_trans();
delay_ms(1000);
esp8266_send_data("555",100);//像我這里,發送的資料就是555,你可以設定成其它你想要的資料
atk_8266_quit_trans();
while(1)
{
}
}
esp8266.c檔案
void esp8266_start_trans(void)
{
atk_8266_send_cmd("AT+CWMODE=1","OK",50);
atk_8266_send_cmd("AT+RST","ready",100);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
while(atk_8266_send_cmd("AT+CWJAP=\"WPT\",\"123456789\"","WIFI GOT IP",800));//這里連得是我本人用手機開的熱點
atk_8266_send_cmd("AT+CIPMUX=0","OK",30);
while(atk_8266_send_cmd("AT+CIPSTART=\"TCP\",\"192.168.43.63\",8080","OK",180));
atk_8266_send_cmd("AT+CIPMODE=1","OK",180);
atk_8266_send_cmd("AT+CIPSEND","OK",60);//開始透傳
}
common.c檔案
//ATK-ESP8266發送命令后,檢測接收到的應答
//str:期待的應答結果
//回傳值:0,沒有得到期待的應答結果
// 其他,期待應答結果的位置(str的位置)
u8* atk_8266_check_cmd(u8 *str)
{
char *strx=0;
if(USART3_RX_STA&0X8000) //接收到一次資料了
{
USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加結束符
strx=strstr((const char*)USART3_RX_BUF,(const char*)str);
}
return (u8*)strx;
}
//向ATK-ESP8266發送命令
//cmd:發送的命令字串
//ack:期待的應答結果,如果為空,則表示不需要等待應答
//waittime:等待時間(單位:10ms)
//回傳值:0,發送成功(得到了期待的應答結果)
// 1,發送失敗
u8 atk_8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
u8 res=0;
USART3_RX_STA=0;
u3_printf("%s\r\n",cmd); //發送命令
if(ack&&waittime) //需要等待應答
{
while(--waittime) //等待倒計時
{
delay_ms(10);
if(USART3_RX_STA&0X8000)//接收到期待的應答結果
{
if(atk_8266_check_cmd(ack))
{
printf("ack:%s\r\n",(u8*)ack);
break;//得到有效資料
}
USART3_RX_STA=0;
}
}
if(waittime==0)res=1;
}
return res;
}
//ATK-ESP8266退出透傳模式
//回傳值:0,退出成功;
// 1,退出失敗
u8 atk_8266_quit_trans(void)
{
while((USART3->SR&0X40)==0); //等待發送空
USART3->DR='+';
delay_ms(15); //大于串口組幀時間(10ms)
while((USART3->SR&0X40)==0); //等待發送空
USART3->DR='+';
delay_ms(15); //大于串口組幀時間(10ms)
while((USART3->SR&0X40)==0); //等待發送空
USART3->DR='+';
delay_ms(500); //等待500ms
return atk_8266_send_cmd("AT","OK",20);//退出透傳判斷.
}
//資料發送函式
u8* esp8266_send_data(u8 *cmd,u16 waittime)
{
char temp[5];
char *ack=temp;
USART3_RX_STA=0;
u3_printf("%s",cmd);
if(waittime)
{
while(--waittime)
{
delay_ms(10);
if(USART3_RX_STA&0X8000)
{
USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;
ack=(char*)USART3_RX_BUF;
printf("ack:%s\r\n",(u8*)ack);
USART3_RX_STA=0;
break;
}
}
}
return(u8*)ack;
}
至于其余的檔案都是一些常規的組態檔,這里就不多說了,如果想要原始碼添加我的聯系方式私聊我即可,
結果展示

上圖是我試驗所得到的結果,之前說過了,我向電腦發送的資料是我自己隨便取的一段數字:555,大家可以根據自己的喜好設定資料發送的內容,

上圖是我用到的單片機和WIFI通信模塊,
經驗總結
本人實作這個功能前前后后花了將近一個月,學到了很多東西,可能對于大佬來說,我現在做的都算不上什么,不過對于我這個單片機入門水平的小白來說,感慨還是挺多的,
1.首先,就是一定要保證你的單片機是可以正常運行的,WIFI通信模塊(本人使用的是正點原子的ESP28266模塊,性能還是可以的),可以用一個USB轉TTL進行指令操作,判斷ESP8266模塊是否能正常運行(因為最近要忙著準備電賽,這個我過一段時間會再發布一個對應的指令除錯教程)
2.其次,一定要多閱讀代碼,我是查閱了CSDN上幾乎所有的相關代碼,各種修改,刪減,濃縮成現在這個樣子,目前我這個代碼放眼整個CSDN應該算是最精簡的了(當然,不排除某些牛逼的大佬可以做到更加精簡),你們可以在我這個代碼的基礎上添加各種功能,如果不需要,你就可以直接拿來用了,
3.你只有看懂了,才能拿來用,所以最好不要放過任何一個疑問,說不定這個疑問就是解決問題的關鍵,
4.最后在強調一下我這部分代碼實作的功能:由單片機向電腦或手機傳送資料(你們需要在電腦或手機下載一個網路除錯助手),或者自己開發一個APP用來接收資料,如果你們想要雙向資料傳輸,可自行添加修改代碼,這里我就不便多說了,可以說我提供的這段代碼算是最最基礎的,你們可以在這個基礎上做一些“上層建筑”,都是可以的,
5.最后的最后,支持還是要支持一下的,請求各路英雄豪杰多多打賞,多多關注,多多點贊,我是只發布高質量文章的李白有點兒黑,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/282380.html
標籤:其他
上一篇:ESP32-C3上手筆記 | 01 - ESP32 C3開發環境搭建(ESP-IDF)
下一篇:物件的凍結
