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<Buf2_Max;k ) //将缓存内容清零
{
Uart2_Buf[k] = 0x00;
}
First_Int = 0; //接收字符串的起始存储位置
}
定义好缓冲区之后,就可以完成发送命令的功能了。
//发送命令
void UART2_Send_Command(char* s)
{
CLR_Buf(); //清空接收数据的buffer
UART2_SendString(s); //发出字符串
UART2_SendString("\r"); //再自动发送 \r\n两个字符
}
发送命令之后,串口会接收到系统的返回值,这个返回值需要验证,验证的函数为:
//寻找字符串
//返回: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("AT\r\n","OK",3,100); //检测模块是否存在
if(ret == 0)
{
return -1;
}
ret = UART2_Send_AT_Command("AT CWMODE=2\r\n","OK",3,100); //设置模块为AP模式
if(ret == 0)
{
return -2;
}
ret = UART2_Send_AT_Command("AT CWSAP=\"wifi\",\"12345678\",5,3\r\n","OK",3,100); //设置接入点名称 密码 通道号 WPA2_PSK
if(ret == 0)
{
return -3;
}
ret = UART2_Send_AT_Command("AT CIPMUX=1\r\n","OK",3,100); //设置为多连接
if(ret == 0)
{
return -4;
}
ret = UART2_Send_AT_Command("AT CIPSERVER=1,5000\r\n","OK",3,100); //设置模块为TCP服务器,端口号为5000
if(ret == 0)
{
return -5;
}
ret = UART2_Send_AT_Command("AT CIPSTO=0\r\n","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 字符串 他会自动发送\r\n 相当于发送了一个指令
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,14\r\n",">",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所示。①④⑤⑥⑦⑧