STM32F429 使用ESP8266通讯心得

吃可爱长大的小学妹 提交于 2019-11-28 10:38:47

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

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!