一直想把wifi模塊和stm32連接起來,但是網上找了很久,並沒有C語言相關的庫,只有基於arduino的ESP8266 C++庫,這個庫是沒辦法直接給stm32使用的,所以自己動手豐衣足食,自己手動將基於arduino的ESP8266 C++庫移植成簡單的C庫,方便使用,目前這個庫實現了基本的功能,可以實現波特率修改,smartlink,斷線重連等功能,wifi模塊主要運行在STA模式。
因為原來是C++ 的庫,這里我也對C++的字符串部分和串口讀取部分做了修改,具體請見我的另一篇博客:
http://blog.csdn.net/liucheng5037/article/details/50504199
還有就是arduino的庫的修改,之前的arduino 的 ESP8266 C++庫是沒有smartlink功能的:
http://blog.csdn.net/liucheng5037/article/details/50464172
本博客使用的工程及庫文件下載,可直接編譯使用
http://download.csdn.net/detail/liucheng5037/9401000
下面開始簡單解析下這個C語言庫的使用方法,具體實現方法這里就不多論述了,大家直接看程序就好了:
接口文件:ESP8266.h
- #ifndef __ESP8266_H__
- #define __ESP8266_H__
- typedef unsigned char uint8_t;
- typedef signed char int8_t;
- typedef unsigned int uint32_t;
- typedef signed int int32_t;
- extern volatile unsigned long sys_tick;
- #define RECV_BUF_SIZE 96//定義接收的緩存,盡可能的大,防止溢出
- #define TIME_OUT 100
- #define AI_LINK 0
- #define ESP_TOUCH 1
- #define AIR_LINK 2
- #define STATUS_GETIP 2 //獲取到IP
- #define STATUS_GETLINK 3 //建立連接
- #define STATUS_LOSTLINK 4 //失去連接
- #define STATUS_LOSTIP 5 //未獲取到IP
- //function
- void AutoLink(void);
- int WifiInit(const char *addr, uint32_t port);
- void timer1msINT(void);
- unsigned long millis(void);
- void delay(unsigned int ms);
- int SetBaud(uint32_t baud);
- int restart(void);
- int setOprToStationSoftAP(void);
- int smartLink(uint8_t type,char *link_msg);
- int stopSmartLink(void);
- int getSystemStatus(void);
- int disableMUX(void);
- int createTCP(const char *addr, uint32_t port);
- int send(const uint8_t *buffer, uint32_t len);
- int recv(uint8_t *buffer, uint32_t buffer_size, uint32_t timeout);
- void rx_empty(void);
- #endif
#ifndef __ESP8266_H__ #define __ESP8266_H__ typedef unsigned char uint8_t; typedef signed char int8_t; typedef unsigned int uint32_t; typedef signed int int32_t; extern volatile unsigned long sys_tick; #define RECV_BUF_SIZE 96//定義接收的緩存,盡可能的大,防止溢出 #define TIME_OUT 100 #define AI_LINK 0 #define ESP_TOUCH 1 #define AIR_LINK 2 #define STATUS_GETIP 2 //獲取到IP #define STATUS_GETLINK 3 //建立連接 #define STATUS_LOSTLINK 4 //失去連接 #define STATUS_LOSTIP 5 //未獲取到IP //function void AutoLink(void); int WifiInit(const char *addr, uint32_t port); void timer1msINT(void); unsigned long millis(void); void delay(unsigned int ms); int SetBaud(uint32_t baud); int restart(void); int setOprToStationSoftAP(void); int smartLink(uint8_t type,char *link_msg); int stopSmartLink(void); int getSystemStatus(void); int disableMUX(void); int createTCP(const char *addr, uint32_t port); int send(const uint8_t *buffer, uint32_t len); int recv(uint8_t *buffer, uint32_t buffer_size, uint32_t timeout); void rx_empty(void); #endif
先簡單介紹幾個函數:
void timer1msINT(void);
1ms定時器自加函數,提供庫里面各個對時間有要求的函數提供基准,該函數必須有1ms定時器中斷調用。
unsigned long millis(void);
返回系統當前時間,從復位開始按ms計時的時間。
int SetBaud(uint32_t baud);
波特率設置,這個很重要,一般出廠的波特率是115200,這里我們要設置成為我們需要的波特率。
int restart(void);
模塊重啟指令,同時也有AT測試指令在里面。
int WifiInit(const char *addr, uint32_t port);
wifi初始化系列指令,默認已STA方式初始化,在設置完波特率后需要調用此函數,內部一直循環執行,直到連接成功為止。
void AutoLink(void);
自動連接,包含smartlink連接,當自動連接不上時自動切換到smartlink連接,可以微信或ESP-TOUCH的方式連接。
下面看個demo介紹如何使用這個庫:
main.c
- int main(void)
- {
- int len=0;
- UserLEDInit();
- USART1Conf(9600);
- DBG("system begin");
- TIM2_Init();
- while(1)
- {
- DBG("chang baud");
- delay(500);
- UartBegin(115200,&USART3Conf,&PutChar);
- SetBaud(19200);
- UartBegin(19200,&USART3Conf,&PutChar);//更改波特率到19200
- if(0 != SetBaud(19200))//在新波特率下檢查是否成功
- {
- break;//成功就退出
- }
- }
- while(0 == WifiInit(HOST_NAME,HOST_PORT));
- while(1)
- {
- if(SerialAvailable() > 5)
- {
- len = recv(buffer, RECVBUF_SIZE, 100);
- if (len > 0)
- {
- tick_3s = 0;
- send(buffer, len);
- }
- }
- if(tick_5ms >= 5)
- {
- tick_5ms = 0;
- tick_3s++;
- tick_500ms++;
- if(tick_500ms >= 100)
- {
- tick_500ms = 0;
- LEDToggle(LED_PIN);
- }
- if(tick_3s >= 600)
- {
- tick_3s = 0;
- //定時檢查連接是否正常,如果不正常,wifi復位重新連接
- if (getSystemStatus() != STATUS_GETLINK)
- {
- DBG("TCP unlink");
- while(!WifiInit(HOST_NAME,HOST_PORT));
- }else
- {
- DBG("TCP link tick");
- }
- }
- }
- }
- }
