ESP8266是一款比较常见的WIFI通讯芯片,今天我给大家分享一下自己使用该芯片的心得。
我使用正点原子的 STM32F429 APOLLO作为开发载体的,虽然他们也有非常详细的开发资料,但是我还是决定自己探索一下,过程也是比较坎坷,好在最终完成了预期效果。
第一步:接线:ESP8266的硬件连接还是很简单的,其中只需要4线,连线如下:
ESP8266 STM32
RX TX
TX RX
VCC VCC
GND GND
第二步:硬件初始化,对ESP8266芯片进行初始化:
通过一块USB-TTL模块将ESP8266连接到电脑,利用串口调试助手进行初始化。硬件的初始化包括将芯片定义为热点源还是连接热点的设备(即AP模式还是STA模式),还有把芯片作为服务器 还是 客户端(SERVER 还是 CLIENT),在我的实验中,我选择AP模式,并且将ESP8266作为服务器。这里解释一下为什么选择AP模式,如果将其作为STA,去连接其他热点,比如路由器,手机热点,电脑热点,你还要先知道你所连接热点的IP地址,更蛋疼的是这个IP地址是会变的,即使是同一台设备的热点。芯片用作服务器还是客户端,两者其实差不多,因为其他设备一旦连接了ESP8266的WIFI,它的IP地址是固定的,比如ESP8266地址是192.168.4.1,那么第一,第二个连接该热点的设备IP地址分别为192.168.4.2;192.168.4.3,以此类推。
只需用串口调试助手发送字符串给ESP8266即可,非常方便,初始化方法如上所示:
完成初始化后,你可以先用网络调试助手试试能不能连接上,如果没有问题那就进行下一步:
个人用这个芯片的时候发现,每次重新上电,你必须再它发一次:AT+CIPMUX=1和AT+CIPSERVER=1,8086,因此你再单片机初始化时用串口一下,比如博主写了这样一个函数:
void ESP8266_Init(void) { delay_ms(10); HAL_UART_Transmit(&huart3,(u8*)"AT+CIPMUX=1\r\n",100,100); delay_ms(10); HAL_UART_Transmit(&huart3,(u8*)"AT+CIPSERVER=1,8086\r\n",100,100); delay_ms(10); }
然后在主程序里面调用一下就OK了。
再就是发送消息的问题了,这个芯片发送消息需要先写一行AT指令。这部分我还没测试成功,等下次做好了再补上。
信息传到单片机后,通过串口中断的方式进行读取。有一点需要注意的是:单片机接收到的完整信号是:
开头一个回车换行符0x0d,0x0a,然后是一个‘+’,接着“IPD,m,n:message”,其中m为连接的设备序号,从0开始,n为字节数,没有结尾标记。message为信息具体如下图所示(ST-LINK中观察到的):
所以我设计的接收程序为:
void ReadEsp8266Message(void){ static u8 ESP8266FLAG1, ESP8266FLAG2, ESP8266FLAG3 = 0; static u16 Number = 0; static u16 Counter = 0; if (ESP8266FLAG3) { Usart_ReceiveBuffer[Counter++] = TempChar; Number--; if (Number == 0) { memcpy(USART3MESSAGE, Usart_ReceiveBuffer, RX_Length); for (int i = 0; i < RX_Length; i++) Usart_ReceiveBuffer[i] = 0; LCD_Fill(0, 150, 479, 179, WHITE); POINT_COLOR = BLACK; LCD_ShowString(30,150,800,24,24,(char*)USART3MESSAGE); ESP8266FLAG3 = 0; Counter = 0; Number = 0; } } if (ESP8266FLAG2 && TempChar != ':'){ Number = Number*10 + (TempChar - '0'); } else if (ESP8266FLAG2 && TempChar == ':') { ESP8266FLAG2 = 0; ESP8266FLAG3++; } if (TempChar == ',') { ESP8266FLAG1++; if (ESP8266FLAG1 == 2) { ESP8266FLAG2++; ESP8266FLAG1 = 0; } } }
然后再串口接收中断函数中调用:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART3) { ReadEsp8266Message(); } }
关于串口接收中断的内容我打算在另一个博客里面写,写完以后我会在这里更新链接,大家也可参考别人写的博客。
最终实现的效果:
博主把接收到的信号打印在了一块显示屏上,甚至通过USMART组件执行接收的消息,关于usmart组件大家有兴趣可以参考正点原子的资料,写的很棒。
第一次写博客,写的乱七八糟的,就当是给自己记笔记了吧。欢迎大家交流和讨论。