前言
物联网,万物互联。这里涉及到的最基本的东西就是如何将所有的物联网设备连接在一起。最简单、最广泛使用的就是互联网。乐鑫公司推出的高性能、低功耗串口wiFi模块ESP8266应该是使用最广泛的一种wIFI模块之一了。
ESP8266内置一个Tensilica(泰思立达〉Xtensa架构的32位处理器L106,具有5级流水线(ARMCortexM3是3级流水线),最大时钟速度为160MHz,可以使用高达16MB的外部SPI Flash。该模块采用串口与MCU(或其他串口设备)通信,内置TCP/IP协议栈,能够实现串口与 wIFI之间的转换。通过该模块,传统的串口设备只需要简单的串口配置,即可通过wiFi传输自己的数据。
WiFi具有两种功能模式:一种叫 AP(Access Point)模式,一种叫Station模式。AP就是我们平时所说的热点,如无线路由器,开了热点的手机等,这些AP设备可以允许其他设备(如手机,笔记本电脑等)输入热点名(SSID)和密码(也可不设置密码)后连接上网;Station则是前面说的连接AP的设备,如手机,笔记本电脑等。ESP8266除支持上述两种模式以外,还可以支持第三种模式:AP+Station,即:将AP 和Station的功能合二为一,它主要是实现无线桥接的功能,该模式应用的场景不多,这里不作介绍。
ESP8266模块自身带有高性能的MCU,因此它既可以通过串口连接为外部 MCU提供 wiFi通信功能;也可以让用户直接在模块内置的MCU上基于RTOS SDK进行软件编程,开发出具有低功耗、低成本的WiFi连接产品,如市面上绝大部分的WiFi智能插座基本上都是直接使用ESP8266模块作主控芯片开发的。
一、什么是AT指令?
1、概述
AT即Attention,它由拨号调制解调器(Modem)的发明者贺氏公司(Hayes)为了控制Modem发明的控制协议。协议本身采用文本,每个命令均以AT打头,因此得名。90年代初,AT指令仅被用于Modem操作。
几年后,主要的移动电话生产厂商诺基亚、爱立信、摩托罗拉和HP共同为GSM研制了一整套AT指令,其中就包括对SMS的控制。AT指令在此基础上演化并被加入GSM 07. 05标准以及现在的GSMO7.07标准,其中拨打电话、收发短信、收发传真等全部由AT命令实现。而在随后的GPRS控制,3G模块,以及工业上常用的PDJ,均采用AT命令集来控制,这样AT指令也就成为了完全标准化和比较健全的标准。
AT指令是以AT作为开头,\r\n字符结束的字符串,每个指令执行成功与否都有相应的返回。其他的一些非预期的信息(如有人拨号进来、线路无信号等),模块将有对应的一些信息提示,接收端可做相应的处理。
2、指令类型
类型 | 指令格式 | 描述 |
---|
执行指令 | AT+<> | 该命令用于执行受模块内部程序控制的变参数不可变的功能。 | 测试指令 | AT+<>=? | 该命令用于该命令用于查询设置指令的参数以及取值范围。 | 查询指令 | AT+<>? | 该命令用于返回参数的当前值。 | 设置指令 | AT+<>=<…> | 该命令用于设置用户自定义的参数值。 |
二、实现步骤
1、分析原理
① 从USART1收到的数据(PC端发过来的)转发给USART2(ESP8266 WiFi模块);
② 从USART2收到的数据(ESP8266 WiFi模块)转发给USART1(PC端)
流程图:
2.配置
①usrt1和usart2配置 保存
3.代码编写
② usart.c
static uint8_t s_uart1_rxch;
char g_uart1_rxbuf[256];
uint8_t g_uart1_bytes;
static uint8_t s_uart2_rxch;
char g_uart2_rxbuf[256];
uint8_t g_uart2_bytes;
UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;
usart1和usart2配置
void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
HAL_UART_Receive_IT(&huart1, &s_uart1_rxch, 1);
}
void MX_USART2_UART_Init(void)
{
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
Error_Handler();
}
HAL_UART_Receive_IT(&huart2, &s_uart2_rxch, 1);
}
void uart_forward(void)
{
if( strstr(g_uart1_rxbuf, "\r\n") )
{
HAL_UART_Transmit(&huart2, (uint8_t *)g_uart1_rxbuf, g_uart1_bytes, 0xFF);
clear_uart1_rxbuf();
}
if(g_uart2_bytes > 0)
{
HAL_Delay(100);
HAL_UART_Transmit(&huart1, (uint8_t *)g_uart2_rxbuf, g_uart2_bytes, 0xFF);
clear_uart2_rxbuf();
}
}
HAL_UART_RxCpltCallback();数据完全接受完成后调用
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
if( g_uart1_bytes < sizeof(g_uart1_rxbuf) )
{
g_uart1_rxbuf[g_uart1_bytes++] = s_uart1_rxch;
}
HAL_UART_Receive_IT(&huart1, &s_uart1_rxch, 1);
}
if(huart->Instance == USART2)
{
if( g_uart2_bytes < sizeof(g_uart2_rxbuf) )
{
g_uart2_rxbuf[g_uart2_bytes++] = s_uart2_rxch;
}
HAL_UART_Receive_IT(&huart2, &s_uart2_rxch, 1);
}
}
结果演示
|