AT 指令详解:基于 MCU 的通信控制实战指南AT 指令详解

在 MCU(单片机)项目中,我们经常需要与各种通信模组(GSM、Wi-Fi、蓝牙等)交互。而这类模组通常都通过串口(UART)与 MCU 通信,控制它们的"语言"就是------AT 指令。

一、什么是 AT 指令?

AT 指令,全称 Attention Command,是一种标准的控制通信模组的命令集。

在 MCU 场景中,常见支持 AT 指令的模组有:

  • GSM 模组:如 SIM800、SIM7600,用于打电话、发短信、联网。

  • Wi-Fi 模组:如 ESP8266、ESP32,用于连接 Wi-Fi、HTTP/MQTT 通信。

  • 蓝牙模组:如 HC-05、JDY 系列。

  • GPS 模组:如 NEO-6M,用于定位。

二、AT 指令格式与分类

AT 指令通过串口发送,格式统一,通常以 AT 开头,后跟操作内容,结尾必须加回车换行(\r\n)。

常见分类如下:

类型 示例 含义
测试模组是否在线 AT\r\n 正常返回 OK 表示模块响应正常
执行命令 AT+RST\r\n 复位模组
查询命令 AT+CSQ?\r\n 查询信号强度等状态
设置命令 AT+CWMODE=1\r\n 设置 Wi-Fi 工作模式
测试支持参数 AT+CWMODE=?\r\n 返回模组支持哪些模式

三、典型模组 AT 指令实用表

以 ESP8266 为例(Wi-Fi 模组):

功能 AT 指令 说明
测试是否正常 AT 返回 OK
模组复位 AT+RST 重启模组
设置模式为 Station AT+CWMODE=1 连接 Wi-Fi 用
连接 Wi-Fi AT+CWJAP="SSID","PWD" 连接热点
查询 IP 地址 AT+CIFSR 返回模组 IP
建立 TCP 连接 AT+CIPSTART="TCP","192.168.1.100",80 与服务器连接
发送数据 AT+CIPSEND=10 返回 >,再发 10 字节数据

四.STM32 使用 USART2 发送 AT 指令

USART2 初始化函数

复制代码
#include "stm32f10x.h"void USART2_Init(uint32_t baudrate) {    GPIO_InitTypeDef GPIO_InitStructure;    USART_InitTypeDef USART_InitStructure;    // 使能 GPIOA 和 USART2 时钟    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);    // PA2 -> TX    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    GPIO_Init(GPIOA, &GPIO_InitStructure);    // PA3 -> RX    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;    GPIO_Init(GPIOA, &GPIO_InitStructure);    // USART2 配置    USART_InitStructure.USART_BaudRate = baudrate;    USART_InitStructure.USART_WordLength = USART_WordLength_8b;    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_Tx | USART_Mode_Rx;    USART_Init(USART2, &USART_InitStructure);    USART_Cmd(USART2, ENABLE);}

USART2 发送函数

复制代码
void USART2_SendByte(uint8_t byte) {    while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);    USART_SendData(USART2, byte);}void USART2_SendString(const char *str) {    while (*str) {        USART2_SendByte(*str++);    }}

发送基础 AT 指令测试

复制代码
void Send_AT_Test(void) {    USART2_SendString("AT\r\n"); // 测试模组是否在线}

示例:连接 Wi-Fi 网络(ESP8266)

复制代码
void ESP8266_ConnectWiFi(const char *ssid, const char *pwd) {    char cmd[100];    USART2_SendString("AT+CWMODE=1\r\n");    Delay_ms(1000);    sprintf(cmd, "AT+CWJAP=\"%s\",\"%s\"\r\n", ssid, pwd);    USART2_SendString(cmd);    Delay_ms(5000); // 等待连接}

代码解释

复制代码
void ESP8266_ConnectWiFi(const char *ssid, const char *pwd)

说明:

该函数用于向 ESP8266 模组发送一系列 AT 指令,完成设置为 Station 模式并连接指定 Wi-Fi 热点的操作。

函数参数:

ssid: 目标 Wi-Fi 的 SSID。

pwd: 目标 Wi-Fi 的密码。

复制代码
char cmd[100];

说明:

定义一个字符数组 cmd,用于存放格式化后的 AT 指令字符串,最大容量为 100 字节。

此缓冲区用于承接 sprintf 生成的字符串命令,随后通过串口发送。

复制代码
USART2_SendString("AT+CWMODE=1\r\n");

说明:

通过 USART2 向 ESP8266 模组发送指令:

AT+CWMODE=1

该指令的含义为:设置 ESP8266 的 Wi-Fi 模式为 Station 模式(即作为客户端连接现有 AP)。

1 表示 Station 模式;

\r\n 为命令终止符,ESP8266 的 AT 命令必须以 CR+LF 结尾。

复制代码
Delay_ms(1000);

说明:

延时 1000 毫秒,确保模组有足够的时间处理 AT+CWMODE=1 命令,避免后续指令过早下发造成命令丢失或处理失败。

复制代码
sprintf(cmd, "AT+CWJAP=\"%s\",\"%s\"\r\n", ssid, pwd);

说明:

使用标准 C 库函数 sprintf 将 Wi-Fi SSID 和密码填充到 AT 命令字符串中,格式如下:

AT+CWJAP="SSID","PASSWORD"\r\n

此命令的作用是:命令 ESP8266 连接到指定的 Wi-Fi 网络。

%s 占位符用于插入字符串;

使用双引号将 SSID 和密码包裹是 AT 指令格式要求;

最后加上 \r\n 表示命令结束。

复制代码
USART2_SendString(cmd);

说明:

将格式化好的 AT+CWJAP 指令通过 USART2 串口发送至 ESP8266。模组接收到后将尝试连接目标 Wi-Fi 热点。

复制代码
Delay_ms(5000); // 等待连接

说明:

延时 5000 毫秒,为模组预留约 5 秒时间尝试连接 Wi-Fi。


示例:发送 TCP 数据包

复制代码
void ESP8266_SendTCP(const char *ip, uint16_t port, const char *data) {    char cmd[100];    sprintf(cmd, "AT+CIPSTART=\"TCP\",\"%s\",%d\r\n", ip, port);    USART2_SendString(cmd);    Delay_ms(2000);    sprintf(cmd, "AT+CIPSEND=%d\r\n", strlen(data));    USART2_SendString(cmd);    Delay_ms(500);    USART2_SendString(data);}
相关推荐
炸膛坦客1 天前
Cortex-M3 内核 MCU-STM32F1 开发之路:(一)单片机 MCU 的构成,包括 FLASH 和 SRAM 的区别,以及引脚类型
stm32·单片机·嵌入式硬件
A9better1 天前
嵌入式开发学习日志39——stm32之I2C总线物理层与常用术语
stm32·单片机·嵌入式硬件·学习
三佛科技-187366133971 天前
FT62FC3X 8位MCU单片机选型表,详细解析FT62FC31A/32A/33A/35A/3FA
单片机·嵌入式硬件
充哥单片机设计1 天前
【STM32项目开源】基于STM32的智能衣柜系统
stm32·单片机·嵌入式硬件
Try1harder1 天前
极海APM32F107V6 + 合宙Air780E
单片机·嵌入式硬件·物联网·合宙air780
文火冰糖的硅基工坊1 天前
[嵌入式系统-134]:智能体以及其嵌入式硬件架构
科技·嵌入式硬件·架构·嵌入式·gpu
电鱼智能的电小鱼1 天前
服装制造企业痛点解决方案:EFISH-SBC-RK3588 柔性化吊挂调度方案
网络·人工智能·嵌入式硬件·算法·制造
清风6666661 天前
基于单片机的便携式温湿度检测烘干机设计
单片机·嵌入式硬件·毕业设计·课程设计
刻BITTER1 天前
用CMake 实现U8g2 的 SDL2 模拟环境
c++·stm32·单片机·嵌入式硬件·arduino
GilgameshJSS1 天前
STM32H743-ARM例程23-USB_HID
arm开发·stm32·嵌入式硬件