IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> stm32实现esp8266的AT指令 -> 正文阅读

[嵌入式]stm32实现esp8266的AT指令


前言

物联网,万物互联。这里涉及到的最基本的东西就是如何将所有的物联网设备连接在一起。最简单、最广泛使用的就是互联网。乐鑫公司推出的高性能、低功耗串口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;


//串口2
static  uint8_t s_uart2_rxch;
char    g_uart2_rxbuf[256];
uint8_t g_uart2_bytes;
/* USER CODE END 0 */

UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;

usart1和usart2配置

void MX_USART1_UART_Init(void)
{

  /* USER CODE BEGIN USART1_Init 0 */

  /* USER CODE END USART1_Init 0 */

  /* USER CODE BEGIN USART1_Init 1 */

  /* USER CODE END USART1_Init 1 */
  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();
  }
  /* USER CODE BEGIN USART1_Init 2 */
  HAL_UART_Receive_IT(&huart1, &s_uart1_rxch, 1);
  /* USER CODE END USART1_Init 2 */

}
/* USART2 init function */

void MX_USART2_UART_Init(void)
{

  /* USER CODE BEGIN USART2_Init 0 */

  /* USER CODE END USART2_Init 0 */

  /* USER CODE BEGIN USART2_Init 1 */

  /* USER CODE END USART2_Init 1 */
  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();
  }
  /* USER CODE BEGIN USART2_Init 2 */

  HAL_UART_Receive_IT(&huart2, &s_uart2_rxch, 1);
  /* USER CODE END USART2_Init 2 */

}

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);   //等待AT指令接收完成
		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);
	}

	//usart2
	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);
		}
}

结果演示

在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章           查看所有文章
加:2021-09-07 10:59:11  更:2021-09-07 11:01:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/29 8:33:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计