打印
[STM32F1]

【转】基于stm32和ESP8266实现wifi模块smartlink功能以及TCP连接

[复制链接]
4541|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一坨代码|  楼主 | 2016-10-16 22:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
     一直想把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
[cpp] view plain copy


  • #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
[cpp] view plain copy


  • 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");  
  •                 }            
  •             }            
  •         }  
  •   
  •     }  
  • }  

沙发
energyplants| | 2016-10-17 11:10 | 只看该作者
stm32用的是哪个芯片,RAM有多大,够用吗?

使用特权

评论回复
板凳
yiyigirl2014| | 2016-10-17 11:27 | 只看该作者
怎么接的,串口吗,这个需要ESP8266里面烧录什么固件不

使用特权

评论回复
地板
一坨代码|  楼主 | 2016-10-23 13:18 | 只看该作者
yiyigirl2014 发表于 2016-10-17 11:27
怎么接的,串口吗,这个需要ESP8266里面烧录什么固件不

用官方自带的固件啊,
串口可以烧写

使用特权

评论回复
5
_gege| | 2016-10-23 16:17 | 只看该作者
实现TCP连接是用的什么接口啊

使用特权

评论回复
6
handleMessage| | 2016-10-23 17:47 | 只看该作者
同问,我也想知道TCP连接是怎么实现的?

使用特权

评论回复
7
一坨代码|  楼主 | 2016-11-2 23:55 | 只看该作者
handleMessage 发表于 2016-10-23 17:47
同问,我也想知道TCP连接是怎么实现的?

官方提供了SDK库,
直接调用就行!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

52

主题

109

帖子

2

粉丝