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组件大家有兴趣可以参考正点原子的资料,写的很棒。

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

  • 相关阅读:
    javascript定义变量和优先级的问题
    css expression explaination
    apply()与call()详解
    jquery $(document).ready() 与window.onload的区别
    ES5严格模式
    css margin collapse
    作业 20181016-10 每周例行报告
    作业 20181009-9 每周例行报告
    作业 20180925-1 每周例行报告
    20180925-7 规格说明书-吉林市2日游
  • 原文地址:https://www.cnblogs.com/showtime20190824/p/11405252.html
Copyright © 2011-2022 走看看