zoukankan      html  css  js  c++  java
  • STM32F429 使用ESP8266通讯心得

    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
    ",100,100);
    	delay_ms(10);
    	HAL_UART_Transmit(&huart3,(u8*)"AT+CIPSERVER=1,8086
    ",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组件大家有兴趣可以参考正点原子的资料,写的很棒。

    第一次写博客,写的乱七八糟的,就当是给自己记笔记了吧。欢迎大家交流和讨论。

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 校门外的树
    Java实现 蓝桥杯VIP 算法训练 统计单词个数
    Java实现 蓝桥杯VIP 算法训练 统计单词个数
    Java实现 蓝桥杯VIP 算法训练 开心的金明
    Java实现 蓝桥杯VIP 算法训练 开心的金明
    Java实现 蓝桥杯 算法训练 纪念品分组
    Java实现 蓝桥杯 算法训练 纪念品分组
    Java实现 蓝桥杯VIP 算法训练 校门外的树
    Java实现 蓝桥杯VIP 算法训练 统计单词个数
    Java实现 蓝桥杯VIP 算法训练 开心的金明
  • 原文地址:https://www.cnblogs.com/showtime20190824/p/11405252.html
Copyright © 2011-2022 走看看