wifi模块ESP8266_AT arduino 库文件部分方法解析及优化
2016-01-05 18:17
567 查看
一直想使用arduino平台来控制ESP8266模块,现在终于差不多实现了,从网上找来了一个相关的库文件,已经实现了大部分功能,但仍有部分功能需要优化,比如smartlink部分未加入。在这里首先感谢ITEAD提供的文章帮助,http://www.arduino.cn/thread-7540-1-1.html。我的平台是arduino uno ,只有一个串口,为了方便仿真,我选择使用软件来串口来与ESP8266通信,注意软串口缓存默认是64byte , 需要改为128 byte或更高,来适应wifi串口。文件SoftwareSerial.h
#define _SS_MAX_RX_BUFF 128 // RX buffer size for wifi于是有如下定义:
SoftwareSerial mySerial(3, 2); /* RX:D3, TX:D2 */ESP8266 wifi(mySerial,115200);//刚开始默认波特率为115200D3口用作RX,D2口用作TX经过测试软串口只有在发送的时候可以支持到115200的波特率,在接收时会有乱码,但是wifi模块出厂默认是115200的波特率,所以我们需要发送指令将115200改为9600。
wifi.SetBaud(9600);//设置波特率wifi.SetBaud(9600);mySerial.begin(9600);建议多将指令发送几次,保证wifi模块接收到指令,完成后将自身的波特率改到9600。串口改变指令原来的库里是没有的,这里要更改库文件,添加如下方法:ESP8266.cpp
/******************************************************************************** 函 数 名 :SetBaud* 函数功能 :设置波特率* 输 入 :baud - 波特率* 输 出 :true success false - fail*******************************************************************************/bool ESP8266::SetBaud(uint32_t baud){return eATUART(baud);}bool ESP8266::eATUART(uint32_t baud){rx_empty();m_puart->print("AT+UART=");m_puart->print(baud);m_puart->println(",8,1,0,0");return recvFind("OK");}接下来在同样的文件下我们来实现smartlink功能,smartlink需要在30s内完成,需要注意的是若smartlink失败,需要使用smartstop指令来关闭这个连接
//add by LC 2016.01.05 16:27bool ESP8266::smartLink(uint8_t type,String &link_msg){return eATCWSMARTSTART(type,link_msg);}//add by LC 2016.01.05 16:27bool ESP8266::stopSmartLink(void){return eATCWSMARTSTOP();}/******************************************************************************** 函 数 名 :eATCWSMARTSTART* 函数功能 :启动smartlink模式,需要在30s内连接* 输 入 :type 启动方式 0 -AL-LINK 1 - ESP-TOUCH 2 - AIR-KISSlink_msg 返回的SSID和PSD* 输 出 :无*******************************************************************************/bool ESP8266::eATCWSMARTSTART(uint8_t type,String &link_msg)//add by LC 2016.01.05 16:27{bool flag;rx_empty();m_puart->print("AT+CWSMARTSTART=");m_puart->println(type);flag = recvFind("OK");if(flag == false) return flag;delay(50);//延时之后等待自动连接rx_empty();return recvFindAndFilter("OK", "SMART SUCCESS", "\r\n\r\nOK", link_msg,30000);}/******************************************************************************** 函 数 名 :eATCWSMARTSTOP* 函数功能 :停止smartlink* 输 入 :无* 输 出 :无*******************************************************************************/bool ESP8266::eATCWSMARTSTOP(void)//add by LC 2016.01.05 16:27{rx_empty();m_puart->println("AT+CWSMARTSTOP");return recvFind("OK");}下面就是使用方法,在smartlink.ino 文件,该函数必须在初始化或断线的时候调用
/******************************************************************************** 函 数 名 :AutoLink* 函数功能 :自动连接,前10s自动连接,若连接失败则进入smartlink模式30s,若依然失败* 则再次回到自动连接,直到连接成功* 输 入 :无* 输 出 :无*******************************************************************************/void AutoLink(void){int8_t status = STATUS_LOSTIP;while(status != STATUS_GETIP){uint32_t start_time = millis();Serial.println("start auto link");//10s自动连接时间while((millis() - start_time < 10000) && status != STATUS_GETIP){status = wifi.getSystemStatus();delay(500);}//连接失败进入smartlink模式 30sif(status != STATUS_GETIP){String link_msg;Serial.println("start smartlink");wifi.stopSmartLink();if(true == wifi.smartLink((uint8_t)AIR_LINK,link_msg)){Serial.println(link_msg);start_time = millis();//等待获取IPwhile((millis() - start_time < 5000) && status != STATUS_GETIP){status = wifi.getSystemStatus();delay(500);}}else{wifi.stopSmartLink();delay(500);Serial.println("link AP fail");}}}Serial.println("link AP OK");}下面简单介绍下几个重要的方法:ESP8266(SoftwareSerial &uart, uint32_t baud = 9600)初始化与wifi模块连接的串口,注意波特率bool restart(void)复位模块方法,建议在初始化时调用,并在设置波特率之后String getIPStatus(void)该方法在不同的连接状态下返回值和格式不同,如下:
AT+CIPSTATUSSTATUS:3+CIPSTATUS:0,"TCP","192.168.31.136",8080,0OKAT+CIPSTATUSSTATUS:2OKint8_t getSystemStatus(void)新增的方法,获取系统当前状态,直接返回值,方便前端调用和判断实现方法如下:
#define STATUS_GETIP 2 //获取到IP#define STATUS_GETLINK 3 //建立连接#define STATUS_LOSTLINK 4 //失去连接#define STATUS_LOSTIP 5 //未获取到IP
/******************************************************************************** 函 数 名 :getSystemStatus* 函数功能 :获取系统状态* 输 入 :无* 输 出 :返回状态*******************************************************************************/int8_t ESP8266::getSystemStatus(void){String list;eATCIPSTATUS(list);int32_t index = list.indexOf("STATUS:");if (index != -1) {index += 7;char status = list.charAt(index);return status - 0x30;//返回状态}else{return -1;}}uint32_t recv(uint8_t *buffer, uint32_t buffer_size, uint32_t timeout = 1000)接收网络数据,返回的是实际接收的长度,注意这里的timout参数,具有死延时的问题,也就是在1s内只能接收一帧数据,建议把这个值调小,但不能调为0,不然无法接收数据。OK,关于该文章的相关库文件和工程下载地址:http://download.csdn.net/detail/liucheng5037/9400821。如有什么问题,欢迎大家交流!
相关文章推荐
- 解决WIFI无线连接或连接上很慢
- WIFI万能钥匙密码查询接口实例
- Android获取当前已连接的wifi信号强度的方法
- 在Android里完美实现基站和WIFI定位
- Android编程实现获取当前连接wifi名字的方法
- Android开发之Wifi基础教程
- android编程实现设置、打开wifi热点共享供他人连接的方法
- ubuntu用wifi连接android调试程序的步骤
- 设置Android设备WIFI在休眠时永不断开的代码实现
- android开发教程之wifi开发示例
- 基于Arduino+LabVIEW的多路数据采集系统
- 基于Arduino+LabVIEW的串口控制LED亮灭
- 基于Protues的Arduino学习笔记01-Arduino UNO实验板设计
- 《Arduino与LabVIEW开发实战》-前言
- 解决ubuntu 15.04 无法开启wifi问题
- Arduino(一)
- 从「林」开始: imx51-linux-rt3070ap-dhcpd
- WiFiAssistant 无线承载网络设置助手的开发历程
- 郑轻校园网工具1.0正式版本首发
- 学习笔记--2014年7月7日