1.ATK-ESP8266基本情况
ATK-ESP8266是ALIENTEK推出的一款高性能的UART-WiFi(串口-无线)模块,ATK-ESP8266模块采用串口(LVTTL)与MCU(或其他串口设备)通信,内置TCP/IP协议栈,能够实现串口与WIFI之间的转换。
通过ATK-ESP8266模块,传统的串口设备只需要简单的串口配置就可以通过网络(WIFI)传输自己的数据。
ATK-ESP8266模块支持LVTTL串口,兼容3.3V和5V单片机系统。模块支持串口转WIFI STA、串口转AP和 WIFI STA+WIFI AP的模式,从而快速构建串口-WIFI 数据传输方案。
ATK-ESP8266 模块非常小巧(29mm*19mm),模块通过 6个2.54mm间距的排针与外部连接,模块外观如图1所示:
图1 ATK-ESP8266 模块外观图
图1中,从左到右,各引脚的详细描述如表1所示:
表1 ATK-ESP8266模块各引脚功能描述
序号
名称
说明
1
VCC
电源(3.3V~5V)
2
GND
电源地
3
TXD
模块串口发送脚(TTL 电平,不能直接接RS232电平!),可接单片机的RXD
4
RXD
模块串口接收脚(TTL 电平,不能直接接RS232电平!),可接单片机的TXD
5
RST
复位(低电平有效)
6
IO_0
用于进入固件烧写模式,低电平是烧写模式,高电平是运行模式(默认状态)
2.STM32F103C8T6串口引脚
STM32F103C8T6有三组串口,分别为USART1、USART2、USART3,具体引脚如表2所示。
表2 STM32F103C8T6串口引脚对应表
引脚
串 口
PA9
USART1_TX
PA10
USART1_RX
PA2
USART2_TX
PA3
USART2_RX
PB10
USART3_TX
PB11
USART3_RX
在本例中用到两个串口,一个是USART1,用于烧写程序和串口通信;另一个是USART2,用于完成ATK-ESP8266模块的串口通信。
3.ATK-ESP8266与STM32F103C8T6连线
ATK-ESP8266内容已经烧写好相应的固件,所以直接用就可以,连线如表3所示。
表3 ATK-ESP8266与STM32F103C8T6连线表
ATK-ESP8266
STM32F103C8T6
VCC
VCC(3.3V或5V)
GND
GND
RXD
PA2(USART2_TX)
TXD
PA3(USART2_RX)
4.USART2的处理
USART2的处理包括两大步,第一步是串口的定义;第二步是串口通信的处理。
第一部分串口的定义主要完成两个任务:①串口的初始化②串口2中断服务程序
① 串口的初始化
//串口2初始化
void USART2_init(u32 bound)
{
//GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO结构体
USART_InitTypeDef USART_InitStructure; //定义USART结构体
NVIC_InitTypeDef NVIC_InitStructure; //定义NVIC结构体
//本例中使用串口2,所对应的引脚为PA2和PA3
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //使能USART2时钟
//USART2_TX GPIOA2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA2
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度为50MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA
//USART2_RX GPIOA3初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA
//Usart2 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
//USART2 初始化设置
USART_InitStructure.USART_BaudRate = bound;//串口波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
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); //初始化串口2
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断
USART_Cmd(USART2, ENABLE); //使能串口2
}
②.串口2中断服务程序
串口2中断服务程序可以完成接收数据的处理
void USART2_IRQHandler(void) //串口2中断服务程序
{
u8 Res=0;
Res = USART_ReceiveData(USART2);
Uart2_Buf[First_Int] = Res; //将接收到的字符串存到缓存中
First_Int++; //缓存指针向后移动
if(First_Int >= Buf2_Max) //如果缓存满,将缓存指针指向缓存的首地址
{
First_Int = 0;
}
}
第二部分串口通信的处理主要完成串口数据的发送。
在本例中,主要的任务是把系统的数据发送给上位机,因此只定义发送数据就可以了。发送数据包括两个部分:①发送采集数据;②发送命令。
① 发送采集数据
采集数据用字符串来存储,因此串口2需要发送的就是字符串数据。
//发送字符串
void UART2_SendString(char* s)
{
while(*s)//检测字符串结束符
{
while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET);
USART_SendData(USART2 ,*s++);//发送当前字符
}
}
② 发送命令
串口2发送命令后,ATK-ESP8266会返回对应的字符串,因此,在发送命令之前,需要选定义一个接收缓冲区。
char Uart2_Buf[Buf2_Max];//串口2接收缓存
同时还需要定义一个函数来清空缓冲区:
//清除串口缓存数据
void CLR_Buf(void)
{
u16 k;
for(k=0;k
{
Uart2_Buf[k] = 0x00;
}
First_Int = 0; //接收字符串的起始存储位置
}
定义好缓冲区之后,就可以完成发送命令的功能了。
//发送命令
void UART2_Send_Command(char* s)
{
CLR_Buf(); //清空接收数据的buffer
UART2_SendString(s); //发出字符串
UART2_SendString("r"); //再自动发送 rn两个字符
}
发送命令之后,串口会接收到系统的返回值,这个返回值需要验证,验证的函数为:
//寻找字符串
//返回:1 已找到 0 未找到
u8 Find(char *a)
{
if(strstr(Uart2_Buf, a)!=NULL)
{
return 1;
}
else
{
return 0;
}
}
至此,串口2就已经处理好了。
5.ATK-ESP8266模块的处理
ATK-ESP8266模块的处理包括三步:第一步ESP8266模块初始化;第二步ESP8266数据的传输;第三步ESP8266数据的接收。
第一步ESP8266模块初始化
/设置WIFI模块模式
//多连接 AP 接入点名称 密码 通道号 WPA2_PSK
signed ESP8266_wifi_Init(void)
{
u8 ret;
ret = UART2_Send_AT_Command("ATrn","OK",3,100); //检测模块是否存在
if(ret == 0)
{
return -1;
}
ret = UART2_Send_AT_Command("AT+CWMODE=2rn","OK",3,100); //设置模块为AP模式
if(ret == 0)
{
return -2;
}
ret = UART2_Send_AT_Command("AT+CWSAP="wifi","12345678",5,3rn","OK",3,100); //设置接入点名称 密码 通道号 WPA2_PSK
if(ret == 0)
{
return -3;
}
ret = UART2_Send_AT_Command("AT+CIPMUX=1rn","OK",3,100); //设置为多连接
if(ret == 0)
{
return -4;
}
ret = UART2_Send_AT_Command("AT+CIPSERVER=1,5000rn","OK",3,100); //设置模块为TCP服务器,端口号为5000
if(ret == 0)
{
return -5;
}
ret = UART2_Send_AT_Command("AT+CIPSTO=0rn","OK",3,100); //设置超时时间为0
if(ret == 0)
{
return -6;
}
return 0;
}
ATK-ESP8266初始化需要通过USART2来发送AT命令来完成,因此还需要定义一个UART2_Send_AT_Command函数。
//发送AT指令
//*b:需要发送的字符串
//*a:查找是否返回的字符串
//wait_time:发送的次数
//interval_time:每次等待的时间
u8 UART2_Send_AT_Command(char *b,char *a,u8 wait_time,u32 interval_time)
{
u8 i;
i = 0;
while(i < wait_time) //如果没有找到 就继续再发一次指令 再进行查找目标字符串
{
UART2_Send_Command(b);//串口2发送 b 字符串 他会自动发送rn 相当于发送了一个指令
delay_ms(interval_time); //等待一定时间 传50的话就是 50*20ms = 1秒
if(Find(a)) //查找需要应答的字符串 a
{
return 1;
}
i++;
}
return 0;
}
第二步ESP8266数据的传输
//发送数据
//*buf:需要发送的字符串
void ESP8266_send_data(char *buf)
{
UART2_Send_AT_Command("AT+CIPSEND=0,14rn",">",3,50); //发送通道号,以及需要发送的字符个数
delay_ms(200);
UART2_SendString(buf);
delay_ms(100);
}
第三步ESP8266接收数据的处理
//接收来自上位机的控制指令
//查询返回值是否为"XXXXXX",如果是,点亮LED灯。
void Receive_data(void)
{
if(Find("XXXXXX") == 1)
{
LED=0
}
}
6.头文件的处理
ifndef __WIFI_H
define __WIFI_H
include "sys.h"
define Buf2_Max 100 //串口2缓存长度
void USART2_init(u32 bound);
void CLR_Buf(void);
void UART2_SendString(char* s);
void UART2_Send_Command(char* s);
u8 Find(char *a);
u8 UART2_Send_AT_Command(char *b,char *a,u8 wait_time,u32 interval_time) ;
signed ESP8266_wifi_Init(void);
void ESP8266_send_data(char *buf);
endif
7.测试实例程序运行
测试实例的主要功能为利用光敏传感器采集光照强度,当光照强度高于某一设定值时,LED灯亮,当光照强度低于某一设定值时,LED灯灭。
串口和ATK-ESP8266向上位机传送数据。
①测试实例的硬件清单如表4所示。
表4 测试实例硬件清单
STM32F103C8T6引脚
元件
功能描述
PA9
USART1_TX
USB转串口TTL(USART1)连线
PA10
USART1_RX
VCC5.0
USART1_VCC
GND
USART1_GND
PA2
ATK-ESP8266_RXD
ATK-ESP8266(USART2)
连线
PA3
ATK-ESP8266_TXD
VCC3.3
ATK-ESP8266_VCC
GND
ATK-ESP8266_GND
PC13
LED1
LED连线
VCC3.3
阳极
GND
阴极(接电阻)
PB0
光敏传感器
光敏传感器连线
VCC3.3
VCC
GND
GND
硬件实物如图2所示。
图2 硬件实物图
②查看固件ATK-ESP8266的IP地址
采用USB转串口芯片与ATK-ESP8266进行连接,如图3所示。
图3 USB转串口芯片与ATK-ESP8266相连
连好后接在电脑的USB口上,打开串口助手,如图4所示。①④⑤⑥⑦⑧
图4 USB转串口芯片与ATK-ESP8266相连
发送AT命令到串口,会得到应答OK,如图5所示。
图5 发送AT命令
图6 发送AT+CIFSR命令
图6中③处就是ATK-ESP8266模块的IP地址。
③ 完成STM32与网络助手的通信
这一部分需要4步来完成。第一步,将ATK-ESP8266模块连回STM32芯片;第二步,烧程序;第三步,电脑与ATK-ESP8266模块wifi相连,如图7所示。
图7 连接wifi
第四步,打开网络调试助手,设置为TCP Client方式,设置好查到的IP地址,以及端口为5000(程序中定义为5000),点击连接,如图中①所示,连接按钮变为关闭,②处显示为接收到的数据。
图8 接收数据显示
以上是STM32 中ATK-ESP8266模块的工作过程。欢迎共同讨论,纠错。期待关注、点赞、转发。粉丝朋友可直接私信索要相关资料(项目源码)。
免责声明:内容来自用户上传并发布,站点仅提供信息存储空间服务,不拥有所有权,本网站所提供的信息只供参考之用。