cAT AT 命令解析器高级示例
源码位置: samples/subsys/cAT/demo 查看源码
功能说明
演示 cAT 库的高级功能,包括多种变量类型、变量写入回调通知,以及复杂的命令处理。
本示例展示如何处理不同的数据类型(整数、十六进制地址、字符串、二进制数据)以及通过回调函数实时获取变量更新通知。
硬件连接
UART1_TX (PB2): 传输数据,连接到 USB-UART 转接器的 RX
UART1_RX (PB3): 接收数据,连接到 USB-UART 转接器的 TX
连接到 PC 串口工具,配置为 115200, 8N1, 无流控
示例内容
本示例演示以下高级功能:
多种变量类型: INT_DEC(整数)、UINT_DEC(无符号整数)、NUM_HEX(十六进制)、BUF_STRING(字符串)、BUF_HEX(二进制数据)
变量写入回调: 当变量被更新时,自动调用相应的回调函数通知应用
多参数命令: 处理包含多个参数的复杂 AT 命令
命令读写处理: 支持命令的写入(设置)和读取(查询)操作
参数验证: 演示如何通过回调函数验证参数的有效性
编译
重要提示:在编译前,请先确认您使用的开发板型号。SDK 目前支持以下开发板:
arcs_evb - ARCS EVB 评估板
arcs_mini - ARCS Mini 开发板
根据您的开发板型号,选择对应的编译命令:
在示例目录下执行编译:
# 使用 arcs_evb 开发板
./build.sh -C -DBOARD=arcs_evb
# 或使用 arcs_mini 开发板
./build.sh -C -DBOARD=arcs_mini
Note
如果在 SDK 根目录执行,需要指定示例路径:
# 使用 arcs_evb 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_evb
# 或使用 arcs_mini 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_mini
Note
确保已安装对应的工具链。
烧录
编译完成后,使用 SDK tools 目录下的 cskburn 工具烧录固件:
./tools/burn/cskburn -s /dev/ttyUSB0 -b 3000000 0x0 build/arcs.bin -C arcs
Note
烧录参数说明:
-s /dev/ttyUSB0:串口设备路径,需要根据实际情况修改 - Linux 系统:通常是/dev/ttyUSB0或/dev/ttyACM0- 可通过ls /dev/tty*命令查看可用串口设备 - 不同开发板或 USB 转串口芯片可能使用不同的设备名-b 3000000:烧录波特率(3Mbps)0x0:烧录起始地址build/arcs.bin:编译生成的固件路径-C arcs:芯片类型
注意事项:
确保开发板已正确连接到电脑
如果无法识别串口设备,请检查 USB 连接线是否正常,或尝试其他 USB 端口
预期输出
系统启动输出:
[I][cat_demo] cAT AT Command Parser - Demo Example
[I][cat_demo] =====================================
[I][cat_uart] cAT UART adapter initialized on uart1 @ 115200 baud
[I][cat_demo] AT command parser ready on uart1
[I][cat_demo] Supported AT commands:
[I][cat_demo] +GO - Go to position (x, y) with message
[I][cat_demo] +SET - Set speed, hex address and hex buffer
[I][cat_demo] #TEST - Run test
[I][cat_demo] #HELP - Print command list
[I][cat_demo] #QUIT - Quit the demo
[I][cat_uart] cAT UART task started
发送 AT+GO=10,20,"hello" 后的输出:
[I][cat_demo] x variable updated internally to: 10
[I][cat_demo] y variable updated internally to: 20
[I][cat_demo] msg variable updated 5 bytes internally to: <hello>
[I][cat_demo] <+GO>: x=10 y=20 msg=hello @ speed=0
[I][cat_demo] <bytes>: 00000000
OK
发送 AT+SET=100,0x1234,AABBCCDD 后的输出:
[I][cat_demo] speed variable updated internally to: 100
[I][cat_demo] adr variable updated internally to: 0x1234
[I][cat_demo] bytes_buf variable updated 4 bytes internally to: AABBCCDD
[I][cat_demo] <+SET>: SET SPEED TO = 100
OK
发送 AT+SET? 后的输出:
+SET: 100,0x1234,AABBCCDD
OK
发送 AT#HELP 后的输出:
+HELP: +GO(WR),+SET(RW),#TEST(RUN),#HELP(RUN),#QUIT(RUN)
OK
核心 API
API |
说明 |
|---|---|
|
初始化 UART 适配器 |
|
获取 IO 接口 |
|
获取互斥锁接口 |
|
初始化 AT 命令解析器 |
|
启动后台处理任务 |
|
处理一次 AT 命令(自动调用) |
关键代码
定义多种变量类型:
/* GO 命令的变量:整数、二进制 */
static uint8_t x;
static uint8_t y;
static char msg[16];
static struct cat_variable go_vars[] = {
{
.type = CAT_VAR_UINT_DEC, /* 无符号十进制 */
.data = &x,
.data_size = sizeof(x),
.write = x_write, /* 写入回调 */
.name = "x",
.access = CAT_VAR_ACCESS_READ_WRITE,
},
{
.type = CAT_VAR_UINT_DEC,
.data = &y,
.data_size = sizeof(y),
.write = y_write,
.name = "y",
.access = CAT_VAR_ACCESS_READ_WRITE,
},
{
.type = CAT_VAR_BUF_STRING, /* 字符串缓冲区 */
.data = msg,
.data_size = sizeof(msg),
.write = msg_write,
.name = "msg",
.access = CAT_VAR_ACCESS_READ_WRITE,
}
};
/* SET 命令的变量:整数、十六进制地址、二进制 */
static int32_t speed;
static uint16_t adr;
static uint8_t bytes_buf[4];
static struct cat_variable set_vars[] = {
{
.type = CAT_VAR_INT_DEC, /* 有符号十进制 */
.data = &speed,
.data_size = sizeof(speed),
.write = speed_write,
.name = "speed",
.access = CAT_VAR_ACCESS_READ_WRITE,
},
{
.type = CAT_VAR_NUM_HEX, /* 十六进制数字 */
.data = &adr,
.data_size = sizeof(adr),
.write = adr_write,
.name = "address",
.access = CAT_VAR_ACCESS_READ_WRITE,
},
{
.type = CAT_VAR_BUF_HEX, /* 十六进制缓冲区 */
.data = &bytes_buf,
.data_size = sizeof(bytes_buf),
.write = bytesbuf_write,
.name = "buffer",
.access = CAT_VAR_ACCESS_READ_WRITE,
}
};
变量写入回调函数:
/* 当 x 变量被写入时自动调用 */
static int x_write(const struct cat_variable *var, size_t write_size)
{
LOGI("x variable updated internally to: %u", x);
/* 可在此处触发硬件更新、参数验证等 */
return 0; /* 返回 0 表示成功,-1 表示失败 */
}
/* 当 msg 变量被写入时自动调用 */
static int msg_write(const struct cat_variable *var, size_t write_size)
{
LOGI("msg variable updated %zu bytes internally to: <%s>", write_size, msg);
return 0;
}
/* 当 bytes_buf 变量被写入时自动调用 */
static int bytesbuf_write(const struct cat_variable *var, size_t write_size)
{
LOGI("bytes_buf variable updated %zu bytes internally to: %02X%02X%02X%02X",
write_size, bytes_buf[0], bytes_buf[1], bytes_buf[2], bytes_buf[3]);
return 0;
}
命令处理器:
/* AT+GO=<x>,<y>,<msg> 的处理器 */
static cat_return_state go_write(const struct cat_command *cmd, const uint8_t *data,
const size_t data_size, const size_t args_num)
{
LOGI("<%s>: x=%d y=%d msg=%s @ speed=%d",
cmd->name,
x, y, msg, (int)speed);
LOGI("<bytes>: %02X%02X%02X%02X",
bytes_buf[0], bytes_buf[1], bytes_buf[2], bytes_buf[3]);
return CAT_RETURN_STATE_OK;
}
/* AT+SET=<speed>,<addr>,<buf> 的处理器 */
static cat_return_state set_write(const struct cat_command *cmd, const uint8_t *data,
const size_t data_size, const size_t args_num)
{
LOGI("<%s>: SET SPEED TO = %d", cmd->name, (int)speed);
return CAT_RETURN_STATE_OK;
}
/* AT+SET? 的读取处理器 */
static cat_return_state set_read(const struct cat_command *cmd, uint8_t *data,
size_t *data_size, const size_t max_data_size)
{
/* cAT 会自动格式化变量并输出 */
return CAT_RETURN_STATE_DATA_OK;
}
注意事项
变量写入回调: 回调函数在变量被 cAT 解析器更新时自动调用,返回 0 表示成功,-1 表示失败
多种变量类型支持:
CAT_VAR_INT_DEC: 有符号整数(十进制)CAT_VAR_UINT_DEC: 无符号整数(十进制)CAT_VAR_NUM_HEX: 十六进制数字(如 0x1234)CAT_VAR_BUF_STRING: 字符串缓冲区(带双引号,如 “hello”)CAT_VAR_BUF_HEX: 二进制数据(十六进制格式,如 AABBCCDD)
命令参数验证: 使用
args_num检查接收的参数个数是否匹配预期字符串处理: 字符串变量使用双引号,支持转义字符(\, “, \n)
十六进制数据: BUF_HEX 类型支持任意二进制数据,以十六进制表示
错误处理: 回调函数返回 -1 会导致命令返回 ERROR
命令参考
命令 |
说明 |
示例 |
|---|---|---|
|
移动到位置并显示消息 |
|
|
设置速度、地址和缓冲区 |
|
|
查询 SET 变量 |
|
|
运行测试 |
|
|
列出所有命令 |
|
|
退出示例 |
|