AT 指令详解:基于 MCU 的通信控制实战指南AT 指令详解_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);
}