目錄
- 前言
- ESP8266模塊 相關資料
- 代碼下載:
- 功能介紹:
- 拓展應用
- 功能介紹:
- 接線
- 接ATK MODULE
- 沒有ATK MODULE情況
- 效果圖
- TCP 服務端
- 網路除錯助手
- 網路測驗
- 雙管齊下
- TCP 客戶端
- UDP 客戶端
- 核心代碼
- main.c
- 參考用圖
- 拓展
- STA模式
- TCP服務端
- TCP客戶端
前言
參考資料:
STM32F1開發指南(精英版)-庫函式版本_V1.2.pdf
ATK-ESP8266 WIFI用戶手冊_V1.2.pdf
ATK_ESP8266V1.2.pdf
ATK-ESP8266 WIFI模塊使用說明(戰艦V3&精英版)_AN1509A.pdf
原始碼參考:正點原子 (庫函式版本,適合戰艦V3和精英STM32開發板)擴展實驗13 ATK-ESP8266 WIFI模塊測驗實驗) 這個例程功能比較全,也很強大,我對這個例程進行了精簡和刪改,LCD顯示也注釋了,
開發板:正點原子 STM32F103 精英版
語言:C語言
開發環境:Keil5
手機:準備的軟體是 網路除錯助手 或 網路測驗

開發板使用了 LED KEY TFTLCD USART SPI ESP8266模塊
ESP8266模塊 相關資料
更多參考底部




代碼下載:
碼云 GitHub
功能介紹:
復位1秒后,進入ap_demo()函式,默認配置為AP模式,TCP 服務端,埠為8086,KEY0按下發送測驗資料,KEY_UP按下結束測驗,期間會有串口列印,最好復位后就把串口打開看資訊,
main.c中可以設定網路模式和IP地址,
u8 netpro = 0; //網路模式 0,TCP服務器 1,TCP客戶端 2,UDP模式
u8 ipbuf[16] = "192.168.4.2"; //IP (根據你的設備連上模塊后分配到的IP填寫)
common.c中可以設定 埠 wifi資訊等
//連接埠號:8086,可自行修改為其他埠.
const u8* portnum="8086";
//WIFI STA模式,設定要去連接的路由器無線引數,請根據你自己的路由器設定,自行修改.
const u8* wifista_ssid="wifi_name"; //路由器SSID號
const u8* wifista_encryption="wpawpa2_aes"; //wpa/wpa2 aes加密方式
const u8* wifista_password="password"; //連接密碼
//WIFI AP模式,模塊對外的無線引數,可自行修改.
const u8* wifiap_ssid="ATK-ESP8266"; //對外SSID號
const u8* wifiap_encryption="wpawpa2_aes"; //wpa/wpa2 aes加密方式
const u8* wifiap_password="12345678"; //連接密碼
拓展應用
功能介紹:
AP STA STA+AP 模式下,建立tcp/udp連接后,發送指定命令,控制LED1和蜂鳴器的開關,
命令如下:(每行都是一條命令,不要有換行等)具體實作在common.c中
LED1 ON
LED1 OFF
BEEP ON
BEEP OFF
GET T&H
參考文章:STM32F103+ESP8266(WiFi)模塊 簡單應用之遠程控制LED和蜂鳴器、讀取溫濕度
接線
接ATK MODULE




沒有ATK MODULE情況
VCC -》 5V
GND -》 GND
TXD -》 PB11
RXD -》 PB10
RST -》 PA4
IO_0 -》 PA15


效果圖
TCP 服務端
u8 netpro = 0; //main.c ap_demo() 網路模式 0,TCP服務器 1,TCP客戶端 2,UDP模式
燒寫完后,復位,打開串口除錯工具,

可以從上圖中看到,wifi的具體資訊
IP地址:192.168.4.1 埠:8086
請用設備連接WIFI熱點:SSID:ATK-ESP8266
加密方式:wpawpa2_aes
密碼:12345678
狀態:TCP服務器
根據上面的資訊連接wifi(ATK-ESP8266),連接成功后查看詳細資訊

網路除錯助手
打開軟體,選擇頂部“tcp client”,點擊“增加”,輸入上面的IP地址和埠,進行“增加”

提示“連接成功”,并且左上角出現 小塊顯示增加的連接

此時串口收到連接資訊,連接成功

手機編輯文本“123321”,點擊發送,STM32按下KEY0發送測驗資料,頂部收到資料,最后長按連接塊,“斷開”連接,

串口列印如下

網路測驗
打開手機軟體“網路測驗”,選擇TCP

右上角 “創建連接”,填入上面串口列印的IP:埠 ,點擊“確定”

右上角顯示“已連接”就是連上了,然后我們發送“好家伙”,再STM32按KEY0(發送測驗資料)

最后按右上角“已連接”,斷開連接

串口助手收到的資料如下

雙管齊下


TCP 客戶端
u8 netpro = 1; //main.c ap_demo() 網路模式 0,TCP服務器 1,TCP客戶端 2,UDP模式
u8 ipbuf[16] = "192.168.4.2"; //IP (根據你的設備連上模塊后分配到的IP填寫)
手機創建TCP 服務端 監聽8086埠,等待客戶端主動連接

注意下時間線0.0



UDP 客戶端
u8 netpro = 2; //main.c ap_demo() 網路模式 0,TCP服務器 1,TCP客戶端 2,UDP模式
u8 ipbuf[16] = "192.168.4.2"; //IP (根據你的設備連上模塊后分配到的IP填寫)

手機創建UDP server,監聽8086埠


按下KEY0,主動發送資料

手機連接建立,點擊進入


核心代碼
完整代碼參考 碼云 GitHub
main.c
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "key.h"
#include "usmart.h"
#include "malloc.h"
#include "usart3.h"
#include "common.h"
// AP模式測驗
void ap_demo(void);
int main(void)
{
delay_init(); //延時函式初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設定中斷優先級分組為組2:2位搶占優先級,2位回應優先級
uart_init(115200); //串口初始化為115200
usmart_dev.init(72); //初始化USMART
LED_Init(); //初始化與LED連接的硬體介面
KEY_Init(); //初始化按鍵
//LCD_Init(); //初始化LCD
usart3_init(115200); //初始化串口3
my_mem_init(SRAMIN); //初始化內部記憶體池
//LCD_Clear(BLACK);
delay_ms(1000);
// atk_8266_test(); //進入ATK_ESP8266測驗
ap_demo();
}
// AP模式測驗
void ap_demo(void)
{
u8 timex = 0;
u8 netpro = 0; //網路模式 0,TCP服務器 1,TCP客戶端 2,UDP模式
u8 key;
u8 ipbuf[16] = "192.168.4.2"; //IP (根據你的設備連上模塊后分配到的IP填寫)
u8 *p;
u16 t = 999; //加速第一次獲取鏈接狀態
u16 rlen = 0;
u8 constate = 0; //連接狀態
while(atk_8266_send_cmd("AT","OK",20))//檢查WIFI模塊是否在線
{
atk_8266_quit_trans();//退出透傳
atk_8266_send_cmd("AT+CIPMODE=0","OK",200); //關閉透傳模式
printf("未檢測到模塊!!!\r\n");
delay_ms(800);
printf("嘗試連接模塊...\r\n");
}
while(atk_8266_send_cmd("ATE0","OK",20));//關倍訓顯
printf("ATK_ESP8266 WIFI模塊測驗\r\n");
printf("WIFI AP\r\n");
atk_8266_msg_show(0, 0, 0);
while(1)
{
delay_ms(10);
atk_8266_at_response(1);//檢查ATK-ESP8266模塊發送過來的資料,及時上傳給電腦
printf("ATK-ESP WIFI-AP 測驗\r\n");
printf("正在配置ATK-ESP8266模塊,請稍等...\r\n");
p=mymalloc(SRAMIN,32); //申請32位元組記憶體
PRESTA:
if(netpro&0X02) //UDP
{
printf("ATK-ESP WIFI-AP 測驗\r\n");
printf("正在配置ATK-ESP模塊,請稍等...\r\n");
sprintf((char*)p,"AT+CIPSTART=\"UDP\",\"%s\",%s",ipbuf,(u8*)portnum); //配置目標UDP服務器
atk_8266_send_cmd("AT+CIPMUX=0","OK",100); //單鏈接模式
while(atk_8266_send_cmd(p,"OK",500));
}
else //TCP
{
if(netpro&0X01) //TCP Client 透傳模式測驗
{
printf("ATK-ESP WIFI-AP 測驗\r\n");
printf("正在配置ATK-ESP模塊,請稍等...\r\n");
atk_8266_send_cmd("AT+CIPMUX=0","OK",20); //0:單連接,1:多連接
sprintf((char*)p,"AT+CIPSTART=\"TCP\",\"%s\",%s",ipbuf,(u8*)portnum); //配置目標TCP服務器
while(atk_8266_send_cmd(p,"OK",200))
{
printf("WK_UP:回傳重選");
printf("ATK-ESP 連接TCP Server失敗"); //連接失敗
key=KEY_Scan(0);
if(key==WKUP_PRES)goto PRESTA;
}
atk_8266_send_cmd("AT+CIPMODE=1","OK",200); //傳輸模式為:透傳
}
else //TCP Server
{
printf("ATK-ESP WIFI-AP 測驗\r\n");
printf("正在配置ATK-ESP模塊,請稍等...\r\n");
atk_8266_send_cmd("AT+CIPMUX=1","OK",20); //0:單連接,1:多連接
sprintf((char*)p,"AT+CIPSERVER=1,%s",(u8*)portnum);
atk_8266_send_cmd(p,"OK",20); //開啟Server模式,埠號為8086
}
}
printf("配置ATK-ESP模塊成功!\r\n");
delay_ms(200);
printf("WK_UP:退出測驗 KEY0:發送資料\r\n");
atk_8266_get_wanip(ipbuf);//服務器模式,獲取WAN IP
sprintf((char*)p,"IP地址:%s 埠:%s",ipbuf,(u8*)portnum);
printf("%s\r\n",p); //顯示IP地址和埠
atk_8266_wificonf_show(30,180,"請用設備連接WIFI熱點:",(u8*)wifiap_ssid,(u8*)wifiap_encryption,(u8*)wifiap_password);
printf("狀態:%s\r\n",(u8*)ATK_ESP8266_WORKMODE_TBL[netpro]); //連接狀態
USART3_RX_STA=0;
while(1)
{
key=KEY_Scan(0);
if(key==WKUP_PRES) //WK_UP 退出測驗
{
atk_8266_quit_trans(); //退出透傳
atk_8266_send_cmd("AT+CIPMODE=0","OK",20); //關閉透傳模式
myfree(SRAMIN,p); //釋放記憶體
return;
}
else if(key==KEY0_PRES) //KEY0 發送資料
{
if((netpro==3)||(netpro==2)) //UDP
{
sprintf((char*)p,"ATK-8266%s測驗%02d\r\n",ATK_ESP8266_WORKMODE_TBL[netpro],t/10);//測驗資料
printf("發送資料:%s\r\n",p);
atk_8266_send_cmd("AT+CIPSEND=25","OK",200); //發送指定長度的資料
delay_ms(200);
atk_8266_send_data(p,"OK",100); //發送指定長度的資料
timex=100;
}
else if((netpro==1)) //TCP Client
{
atk_8266_quit_trans();
atk_8266_send_cmd("AT+CIPSEND","OK",20); //開始透傳
sprintf((char*)p,"ATK-8266%s測驗%02d\r\n",ATK_ESP8266_WORKMODE_TBL[netpro],t/10);//測驗資料
printf("發送資料:%s\r\n",p);
u3_printf("%s",p);
timex=100;
}
else //TCP Server
{
sprintf((char*)p,"ATK-8266%s測驗%02d\r\n",ATK_ESP8266_WORKMODE_TBL[netpro],t/10);//測驗資料
printf("發送資料:%s\r\n",p);
atk_8266_send_cmd("AT+CIPSEND=0,25","OK",200); //發送指定長度的資料
delay_ms(200);
atk_8266_send_data(p,"OK",100); //發送指定長度的資料
timex=100;
}
}
if(timex)timex--;
t++;
delay_ms(5);
if(USART3_RX_STA&0X8000) //接收到一次資料了
{
rlen=USART3_RX_STA&0X7FFF; //得到本次接收到的資料長度
USART3_RX_BUF[rlen]=0; //添加結束符
sprintf((char*)p,"收到%d位元組,內容如下",rlen);//接收到的位元組數
printf("%s\r\n",p); //顯示接收到的資料長度
printf("接收資料:%s\r\n",USART3_RX_BUF);//顯示接收到的資料
USART3_RX_STA=0;
if(constate!='+')t=1000; //狀態為還未連接,立即更新連接狀態
else t=0; //狀態為已經連接了,10秒后再檢查
}
if(t==1000)//連續10秒鐘沒有收到任何資料,檢查連接是不是還存在.
{
constate=atk_8266_consta_check();//得到連接狀態
if(constate=='+')printf("連接成功\r\n"); //連接狀態
else printf("連接失敗\r\n");
t=0;
}
if((t%20)==0)LED0=!LED0;
atk_8266_at_response(1);
}
}
}
參考用圖




拓展
STA模式
TCP服務端
準備2個手機,或者能產生wifi信號的設備,
一個手機開啟手機熱點,設定wifi資訊

另一個手機連接熱點,查看詳細資訊,分配到的ip是 192.168.43.39

修改main.c,呼叫 atk_8266_test();
atk_8266_test(); //進入ATK_ESP8266測驗
// ap_demo();
修改common.c,填寫新的STA模式的wifi資訊
//連接埠號:8086,可自行修改為其他埠.
const u8* portnum="8086";
//WIFI STA模式,設定要去連接的路由器無線引數,請根據你自己的路由器設定,自行修改.
const u8* wifista_ssid="ikaros"; //路由器SSID號
const u8* wifista_encryption="wpawpa2_aes"; //wpa/wpa2 aes加密方式
const u8* wifista_password="12345678"; //連接密碼
//WIFI AP模式,模塊對外的無線引數,可自行修改.
const u8* wifiap_ssid="ATK-ESP8266"; //對外SSID號
const u8* wifiap_encryption="wpawpa2_aes"; //wpa/wpa2 aes加密方式
const u8* wifiap_password="12345678"; //連接密碼
修改 wifista.c 的 atk_8266_wifista_test(void) ,IP改成另一個手機的IP(這里給客戶端模式用的,暫時沒用)
u8 ipbuf[16] = "192.168.43.39"; // IP快取
程式重編,燒寫,打開串口,看到提示按鍵




TCP客戶端
這里就用到上面說的ip了
修改 wifista.c 的 atk_8266_wifista_test(void) ,IP改成另一個手機的IP(這里給客戶端模式用的,暫時沒用)
u8 ipbuf[16] = "192.168.43.39"; // IP快取
不重復贅述,直接上結果





轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/281339.html
標籤:其他
