赞
踩
STM32智能小车需要做一个用WIFI控制小车运行和舵机运转的需求。所以选用ESP8266WIFI模块,采用其透传模式来实现这一功能。所谓透传模式就是,服务器端下发指令到ESP8266;而ESP8266模块不会对指令进行任何的数据处理,直接将指令通过uart传给单片机。
上图是ESP8266简易的PCB,如图所示,ESP8266一共有8个接口。
首先我们需要连接VCC和GND,
UTXD接STM32的RX,
URXD接单片机的TX,
CH_PD(EN)脚随便接一个GPIO口,编程该GPIO引脚拉至高电平
其余引脚悬空
正点原子ESP8266资料
安信可ESP8266资料下载—提取码8889
#include "esp8266.h" #include "string.h" #include "usart.h" #include "usart3.h" #include "stm32f10x.h" #include "sys.h" #include "delay.h" #include "led.h" void esp8266_start_trans(void) { //设置工作模式 1:station模式 2:AP模式 3:兼容 AP+station模式 esp8266_send_cmd("AT+CWMODE=2","OK",50); //Wifi模块重启 esp8266_send_cmd("AT+RST","OK",20); delay_ms(1000); //延时3S等待重启成功 delay_ms(1000); delay_ms(1000); //AP模式 esp8266_send_cmd("AT+CWSAP=\"ESP8266\",\"12345678\",1,4","OK",200); esp8266_send_cmd("AT+CIPMUX=1","OK",20); esp8266_send_cmd("AT+CIPSERVER=1,8080","OK",200); } //向ESP8266发送命令 //cmd:发送的命令字符串;ack:期待的应答结果,如果为空,则表示不需要等待应答;waittime:等待时间(单位:10ms) //返回值:0,发送成功(得到了期待的应答结果);1,发送失败 u8 esp8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime) { u8 res=0; USART3_RX_STA=0; u3_printf("%s\r\n",cmd); //发送命令 if(ack&&waittime) //需要等待应答 { while(--waittime) //等待倒计时 { delay_ms(10); if(USART3_RX_STA&0X8000)//接收到期待的应答结果 { if(esp8266_check_cmd(ack)) { printf("ack:%s\r\n",(u8*)ack); break;//得到有效数据 } USART3_RX_STA=0; } } if(waittime==0)res=1; } return res; } //ESP8266发送命令后,检测接收到的应答 //str:期待的应答结果 //返回值:0,没有得到期待的应答结果;其他,期待应答结果的位置(str的位置) u8* esp8266_check_cmd(u8 *str) { char *strx=0; if(USART3_RX_STA&0X8000) //接收到一次数据了 { USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符 strx=strstr((const char*)USART3_RX_BUF,(const char*)str); } return (u8*)strx; }
#ifndef __ESP8266_H #define __ESP8266_H #include "sys.h" #include "stdio.h" //用户配置AT指令 extern char restart[]; extern char cwmode[]; extern char cwlap[]; extern char cwjap[]; extern char cifsr[]; extern char cipmux[]; extern char cipstart[]; extern char cipsend[]; extern char cipserver[]; extern char cwlif[]; extern char cipstatus[]; extern char cipsto[]; extern char cipmode[]; extern char test[]; //函数 u8 esp8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime); u8* esp8266_send_data(u8 *cmd,u16 waittime); u8* esp8266_check_cmd(u8 *str); void esp8266_start_trans(void); u8 esp8266_quit_trans(void); #endif
int main(void) { delay_init(); // 延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设置NVIC中断分组2;2位抢占优先级;2位响应优先级 usart3_init(115200); // 串口初始化为115200 GPIO_init(); esp8266_start_trans(); // esp8266进行初始化 while (1) { if (USART3_RX_STA & 0x8000) { printf("USART3_RX_BUF=%s\r\n", USART3_RX_BUF); sprintf(a, "%s", USART3_RX_BUF); printf("a=%s", a); // 判断收到的字符串是否含有“forward” if (strstr((const char *)a, "forward")) { Forward(); delay_ms(10); } else if (strstr((const char *)a, "back")) { Back(); delay_ms(10); } USART3_RX_STA = 0; } } }
代码部分还应该有uart的初始化部分,和CH_PD脚的GPIO口拉高部分。在这里没有过多赘述。上述文章若有不对的地方还请指点。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。