esp8266模块只能发送不能接收,esp8266能与串口助手直接通信吗

首页 > 实用技巧 > 作者:YD1662024-01-09 01:51:40

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所示:

esp8266模块只能发送不能接收,esp8266能与串口助手直接通信吗(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所示。

esp8266模块只能发送不能接收,esp8266能与串口助手直接通信吗(2)

图2 硬件实物图

②查看固件ATK-ESP8266的IP地址

采用USB转串口芯片与ATK-ESP8266进行连接,如图3所示。

esp8266模块只能发送不能接收,esp8266能与串口助手直接通信吗(3)

图3 USB转串口芯片与ATK-ESP8266相连

连好后接在电脑的USB口上,打开串口助手,如图4所示。①④⑤⑥⑦⑧

esp8266模块只能发送不能接收,esp8266能与串口助手直接通信吗(4)

首页 123下一页

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.