基於stm32和ESP8266實現wifi模塊smartlink功能以及TCP連接


    一直想把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

 

  1. #ifndef __ESP8266_H__  
  2. #define __ESP8266_H__  
  3.   
  4.   
  5. typedef unsigned char uint8_t;  
  6. typedef signed char int8_t;  
  7. typedef unsigned int uint32_t;  
  8. typedef signed int int32_t;  
  9.   
  10. extern volatile unsigned long sys_tick;  
  11.   
  12. #define RECV_BUF_SIZE  96//定義接收的緩存,盡可能的大,防止溢出  
  13. #define TIME_OUT 100  
  14.   
  15. #define AI_LINK 0  
  16. #define ESP_TOUCH 1  
  17. #define AIR_LINK 2  
  18.   
  19. #define STATUS_GETIP 2 //獲取到IP  
  20. #define STATUS_GETLINK 3 //建立連接  
  21. #define STATUS_LOSTLINK 4 //失去連接  
  22. #define STATUS_LOSTIP 5 //未獲取到IP  
  23.   
  24. //function  
  25. void AutoLink(void);  
  26. int WifiInit(const char *addr, uint32_t port);  
  27. void timer1msINT(void);  
  28. unsigned long millis(void);  
  29. void delay(unsigned int ms);  
  30. int SetBaud(uint32_t baud);  
  31. int restart(void);  
  32. int setOprToStationSoftAP(void);  
  33. int smartLink(uint8_t  type,char *link_msg);  
  34. int stopSmartLink(void);  
  35. int getSystemStatus(void);  
  36. int disableMUX(void);  
  37. int createTCP(const char *addr, uint32_t port);  
  38. int send(const uint8_t *buffer, uint32_t len);  
  39. int recv(uint8_t *buffer, uint32_t buffer_size, uint32_t timeout);  
  40. void rx_empty(void);  
  41.   
  42. #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

 

  1. int main(void)  
  2. {  
  3.     int len=0;  
  4.     UserLEDInit();  
  5.     USART1Conf(9600);  
  6.     DBG("system begin");  
  7.     TIM2_Init();  
  8.   
  9.     while(1)  
  10.     {  
  11.         DBG("chang baud");  
  12.         delay(500);  
  13.         UartBegin(115200,&USART3Conf,&PutChar);  
  14.         SetBaud(19200);  
  15.         UartBegin(19200,&USART3Conf,&PutChar);//更改波特率到19200  
  16.         if(0 != SetBaud(19200))//在新波特率下檢查是否成功  
  17.         {  
  18.             break;//成功就退出  
  19.         }     
  20.     }  
  21.   
  22.     while(0 == WifiInit(HOST_NAME,HOST_PORT));  
  23.       
  24.     while(1)  
  25.     {     
  26.         if(SerialAvailable() > 5)  
  27.         {  
  28.             len = recv(buffer, RECVBUF_SIZE, 100);  
  29.             if (len > 0)  
  30.             {  
  31.                 tick_3s = 0;  
  32.                 send(buffer, len);  
  33.             }   
  34.         }  
  35.         if(tick_5ms >= 5)  
  36.         {  
  37.             tick_5ms = 0;  
  38.             tick_3s++;  
  39.             tick_500ms++;  
  40.             if(tick_500ms >= 100)  
  41.             {  
  42.                 tick_500ms = 0;  
  43.                 LEDToggle(LED_PIN);  
  44.             }  
  45.             if(tick_3s >= 600)  
  46.             {  
  47.                 tick_3s = 0;  
  48.                 //定時檢查連接是否正常,如果不正常,wifi復位重新連接  
  49.                 if (getSystemStatus() != STATUS_GETLINK)  
  50.                 {  
  51.                     DBG("TCP unlink");  
  52.                     while(!WifiInit(HOST_NAME,HOST_PORT));  
  53.                 }else  
  54.                 {  
  55.                     DBG("TCP link tick");  
  56.                 }             
  57.             }             
  58.         }  
  59.   
  60.     }  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM