通过 STM32 向 ESP8266 发AT指令,出现无应答、发什么回什么,等等情况的几种可能原因。

默认设备:stm32,esp8266,0.96寸oled屏。

默认原理:利用stm32通过串口向esp8266发AT指令,并且在oled屏上显示其回复内容。

可能原因与排查方式:

1、指令后面缺失\r\n。正确示例:串口发送字符串为“AT\r\n”。

2、esp8266供电不足。可用电表测一下引脚电压,并且酌情考虑用5v供电(小心烧板)。

3、波特率错误。9600,74880,115200等都试一试。

4、串口接收数组太小,esp8266又开启了回显(即esp8266先把你发的指令发回,再发它真正的回复内容),使得在屏幕上显示的就像是发什么回什么。可以扩大数组容量,使用 ATE0 指令关闭回显。

ps. \r\n在0.96寸oled上显示的是一坨乱码。

以下是一个简单的示例代码,使用STM32的USART1与ESP8266通信,通过AT指令获取ESP8266的状态信息并打印到串口1: ```c #include "stm32f10x.h" #define USART1_TX_GPIO GPIO_Pin_9 #define USART1_RX_GPIO GPIO_Pin_10 #define USART1_GPIO GPIOA #define USART1 GPIOA #define USART2_TX_GPIO GPIO_Pin_2 #define USART2_RX_GPIO GPIO_Pin_3 #define USART2_GPIO GPIOA #define USART2 GPIOA void init_USART1(void); void init_USART2(void); void USART1_send(char c); void USART1_puts(char* s); void USART2_send(char c); void USART2_puts(char* s); void delay(int t); int main(void) { init_USART1(); init_USART2(); while(1) { USART2_puts("AT\r\n"); // 送AT指令 delay(1000); // 延时1秒 } } void init_USART1(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = USART1_TX_GPIO; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(USART1_GPIO, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = USART1_RX_GPIO; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(USART1_GPIO, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); } void init_USART2(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = USART2_TX_GPIO; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(USART2_GPIO, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = USART2_RX_GPIO; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(USART2_GPIO, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART2, &USART_InitStructure); USART_Cmd(USART2, ENABLE); } void USART1_send(char c) { while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); USART_SendData(USART1, c); } void USART1_puts(char* s) { while(*s) { USART1_send(*s++); } } void USART2_send(char c) { while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET); USART_SendData(USART2, c); } void USART2_puts(char* s) { while(*s) { USART2_send(*s++); } } void delay(int t) { while(t--) { int i = 1000; while(i--); } } ``` 在该示例代码中,我们使用了两个USART串口,USART1用于与PC通过串口调试助手进行通信,USART2用于与ESP8266进行通信。 在main函数中,我们不断送AT指令,并通过delay函数实现1秒的延时。 在USART初始化函数中,我们使用了STM32的库函数来初始化串口。USART1的初始化为单向送模式,USART2的初始化为双向收模式。 在发送信息的函数中,我们使用了STM32的库函数USART_SendData()送一个字节的数据,并使用USART_GetFlagStatus()函数等待UART完成送。 在delay函数中,我们使用了简单的for循环进行延时。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值