AT 命令
SLE AT 指令集
前置阅读:Hello SLE
学习目标
- 理解 AT 指令在 SLE 调试中的作用——通过串口发送文本命令控制 SLE 功能
- 掌握常用
AT+SLE*指令的语法和返回格式 - 能够用 AT 指令快速验证 SLE 连接 / 广播 / 扫描 / 通知功能(无需编写代码)
- 理解 AT 指令与 API 代码的对应关系
基本概念
AT 指令在开发调试中的价值
在正式代码开发之前,用 AT 指令快速验证硬件和协议栈是否正常。一条指令即可完成广播 / 扫描 / 连接——比写代码快 10 倍。例如:
- 验证两块板子能否建立 SLE 连接——两条 AT 指令即可
- 验证射频发射功率配置——AT 指令查询 / 修改发射功率
- 验证配对功能——AT 指令发起配对
AT 指令框架
WS63 的 AT 指令通过 UART 接收,由 AT 框架解析后调用对应的 SLE API,最后返回结果:
sequenceDiagram
participant UART as 串口助手
participant ATFW as AT 框架
participant SLE as SLE 协议栈
UART->>ATFW: AT+SLEADV=1,1,25\r\n
ATFW->>ATFW: 解析指令名和参数
ATFW->>SLE: sle_start_announce(handle=1, mode=1, interval=25)
SLE-->>ATFW: ERRCODE_SUCC
ATFW-->>UART: OK\r\n
指令格式:AT+<CMD>=<param1>,<param2>\r\n,返回 OK\r\n 或 ERROR\r\n。所有 SLE AT 指令都以 AT+SLE 开头,便于识别。
AT 指令 vs API 代码
以下对照表列出常用操作在 AT 指令和 API 代码中的写法——调试阶段用 AT 验证逻辑,确认可行后再翻译为 C 代码:
| 操作 | AT 指令 | 对应 API |
|---|---|---|
| 启动广播 | AT+SLEADV=1,1,25 |
sle_start_announce() |
| 启动扫描 | AT+SLESEEK=1,100,100 |
sle_start_seek() |
| 连接设备 | AT+SLECONN=<addr> |
sle_connect_remote_device() |
| 断开连接 | AT+SLEDISC=<conn_id> |
sle_disconnect_remote_device() |
| 发起配对 | AT+SLEPAIR=<conn_id> |
sle_pair_remote_device() |
| 读取 RSSI | AT+SLERSSI=<conn_id> |
sle_read_remote_device_rssi() |
| 查询本地地址 | AT+SLEADDR? |
sle_get_local_addr() |
| 发送通知 | AT+SLENTF=<conn_id>,<data> |
ssaps_notify_indicate() |
注:以上指令为示意。实际 SDK 中的 AT 指令名称和参数格式以
AT+SLE*实现为准。完整指令列表见 SDK AT 指令文档。
涉及 API(与 AT 指令对应的)
| AT 指令(示例) | 对应用途 | 对应 API |
|---|---|---|
AT+SLEADV=1,1,25 |
启动广播(announce_id=1, mode=可连, interval=25ms) | sle_start_announce() |
AT+SLESEEK=1,100,100 |
启动扫描(PHY=1M, interval=100, window=100) | sle_start_seek() |
AT+SLECONN=<addr> |
连接指定地址设备 | sle_connect_remote_device() |
AT+SLEDISC=<conn_id> |
断开连接 | sle_disconnect_remote_device() |
AT+SLEPAIR=<conn_id> |
发起配对 | sle_pair_remote_device() |
AT+SLERSSI=<conn_id> |
读取 RSSI | sle_read_remote_device_rssi() |
AT+SLEADDR? |
查询本地地址 | sle_get_local_addr() |
案例说明
做什么
用两块 WS63 开发板 + 串口工具,通过 AT 指令完成广播 → 扫描 → 连接 → 配对 → 通知发送的完整验证。纯文本操作——无需 IDE、无需编译、无需写代码。
案例流程说明
sequenceDiagram
participant PC_A as PC 串口 A
participant S as WS63 Server
participant C as WS63 Client
participant PC_B as PC 串口 B
PC_A->>S: AT+SLEADV=1,1,25
S-->>PC_A: OK
Note over S: 正在广播...
PC_B->>C: AT+SLESEEK=1,100,100
C-->>PC_B: OK
Note over C: 扫描中...
C-->>PC_B: +SLESEEK: addr=XX:XX:XX:XX
PC_B->>C: AT+SLECONN=XX:XX:XX:XX
S-->>PC_A: +SLECONN: conn_id=0
C-->>PC_B: +SLECONN: conn_id=0
Note over S,C: 已连接
PC_B->>C: AT+SLEPAIR=0
C-->>PC_B: OK
S-->>PC_A: +SLEPAIR: success
PC_A->>S: AT+SLENTF=0,hello
C-->>PC_B: +SLENTF: hello
案例操作指导
第一步:烧录 AT 指令固件
打开 menuconfig,启用 AT 模式(取消用户 sample,启用 AT 框架):
这等于设置了 CONFIG_SAMPLE_SUPPORT_SLE_AT_SAMPLE=y。
烧录到两块 WS63 板子。
第二步:接线
两块 WS63 的 UART0 分别接 PC 的两个串口。波特率 115200,8N1。
| 引脚 | WS63 板 A | WS63 板 B |
|---|---|---|
| TX | 接 PC 串口 A 的 RX | 接 PC 串口 B 的 RX |
| RX | 接 PC 串口 A 的 TX | 接 PC 串口 B 的 TX |
| GND | 接 PC GND | 接 PC GND |
AT 指令不区分 Server 和 Client 固件——两块板子烧录同样的 AT 固件,通过不同的 AT 指令来扮演不同角色。这在调试时非常灵活——同一块板子既能当 Server 又能当 Client,随时切换。
第三步:Server 端操作
打开串口 A 的串口助手,依次输入:
AT → 返回 OK(确认 AT 框架正常)
AT+SLEADDR? → 返回本地 MAC 地址
AT+SLEADV=1,1,25 → 返回 OK(启动广播:句柄=1, 模式=可连可扫, 间隔=25ms)
第四步:Client 端操作
打开串口 B 的串口助手,依次输入:
AT → 返回 OK
AT+SLESEEK=1,100,100 → 返回 OK(启动扫描:PHY=1M, 间隔=100, 窗口=100)
→ 自动上报扫描到的设备列表
AT+SLECONN=<addr> → 返回 OK + conn_id(用第三步查到的地址)
第五步:验证连接
连接建立后,两端都会收到 unsolicited 上报:
此时可以继续测试配对和数据发送:
AT+SLEPAIR=0 → 返回 OK(配对 conn_id=0 的设备)
AT+SLERSSI=0 → 返回 RSSI 值(如 -45 dBm)
AT+SLENTF=0,hello_sle → 发送通知数据
关键配置
Kconfig 配置
| 配置项 | 值 | 说明 |
|---|---|---|
CONFIG_SAMPLE_SUPPORT_SLE_AT_SAMPLE |
y | 启用 SLE AT 指令 sample |
CONFIG_SLE_AT_UART_PORT |
0 | AT 指令使用的 UART 端口号 |
CONFIG_SLE_AT_UART_BAUDRATE |
115200 | AT 指令串口波特率 |
串口参数
| 参数 | 值 | 说明 |
|---|---|---|
| 波特率 | 115200 | 固定,与 AT 固件匹配 |
| 数据位 | 8 | 标准配置 |
| 停止位 | 1 | 标准配置 |
| 校验位 | 无 | 标准配置 |
| 流控 | 无 | AT 指令不需要硬件流控 |
| 换行符 | \r\n (CRLF) |
AT 指令必须以此结尾 |
如果串口助手的换行设置不对(例如只发
\n),AT 框架无法识别指令结束符,会一直等待直到超时。
代码详解
本节无代码——AT 指令是通过串口交互的文本命令。以下为指令速查表,按功能分组排列。
发现类指令
| 指令模板 | 参数说明 | 返回格式 | 备注 |
|---|---|---|---|
AT+SLEADV=<handle>,<mode>,<interval> |
handle: 广播句柄(1~16); mode: 0=不可连不可扫 1=可连可扫 2=可连不可扫 3=不可连可扫; interval: 广播间隔(单位 125us) | OK / ERROR |
启动广播 |
AT+SLEADVSTOP=<handle> |
handle: 广播句柄 | OK / ERROR |
停止广播 |
AT+SLESEEK=<phy>,<interval>,<window> |
phy: 1=1M 2=2M 4=4M; interval: 扫描间隔; window: 扫描窗口 | OK / ERROR |
启动扫描,结果通过 +SLESEEK: 上报 |
AT+SLESEEKSTOP |
无 | OK / ERROR |
停止扫描 |
连接类指令
| 指令模板 | 参数说明 | 返回格式 | 备注 |
|---|---|---|---|
AT+SLECONN=<addr> |
addr: 12 位十六进制 MAC 地址(如 AABBCCDDEEFF) | OK + conn_id / ERROR |
发起连接 |
AT+SLEDISC=<conn_id> |
conn_id: 连接句柄(0~7) | OK / ERROR |
断开指定连接 |
AT+SLECONNUPDATE=<conn_id>,<min>,<max>,<latency>,<timeout> |
min/max: 连接间隔(125us); latency: 最大延迟; timeout: 监管超时(10ms) | OK / ERROR |
更新连接参数 |
数据类指令
| 指令模板 | 参数说明 | 返回格式 | 备注 |
|---|---|---|---|
AT+SLENTF=<conn_id>,<data> |
conn_id: 连接句柄; data: 字符串数据 | OK / ERROR |
发送通知(Notification) |
AT+SLEINDC=<conn_id>,<data> |
同上 | OK / ERROR |
发送指示(Indication,需对端确认) |
安全类指令
| 指令模板 | 参数说明 | 返回格式 | 备注 |
|---|---|---|---|
AT+SLEPAIR=<conn_id> |
conn_id: 连接句柄 | OK / ERROR |
发起配对 |
AT+SLERMPAIR=<conn_id> |
conn_id: 连接句柄 | OK / ERROR |
删除绑定信息 |
AT+SLEBOND? |
无 | 已绑定设备列表 | 查询已配对设备 |
信息查询类指令
| 指令模板 | 参数说明 | 返回格式 | 备注 |
|---|---|---|---|
AT+SLEADDR? |
无 | 12 位十六进制 MAC 地址 | 查询本地地址 |
AT+SLERSSI=<conn_id> |
conn_id: 连接句柄 | 十进制 RSSI 值(如 -45) | 读取当前连接 RSSI |
AT+SLESTATE? |
无 | 协议栈状态信息 | 查询当前 SLE 协议栈状态 |
AT+SLEVER? |
无 | 版本号字符串 | 查询 SLE 协议栈版本 |
常见错误值
| 返回值 | 含义 | 可能原因 |
|---|---|---|
ERROR |
通用错误 | 参数错误、指令格式错误、协议栈未就绪 |
+CME ERROR: 1 |
未连接 | 在未建立连接时调用了需要连接的操作 |
+CME ERROR: 2 |
参数无效 | 参数超出范围或格式不正确 |
+CME ERROR: 3 |
操作进行中 | 前一次同类操作尚未完成 |
+CME ERROR: 4 |
不支持 | 当前固件未开启此功能 |