这一章在干嘛?
USMART 调试组件实验:串口命令解析 + 函数指针 + 调用任意无参数函数。从此不用反复编译烧录就能调内部函数。
21.1 USMART 调试组件简介
USMART 是正点原子开发的串口调试工具,类似 Linux 的命令行:
- 输入
led0(1)→ 调用void led0(uint8_t x)函数; - 输入
beep()→ 调用beep(); - 自动列出已注册函数名(
help)。
USMART 由三部分组成:
| 模块 | 作用 |
|---|---|
| 命令解析 | 从串口接收字符串,解析为「函数名(参数列表)」 |
| 函数注册表 | 所有可用函数的名称、参数类型 |
| 调用执行 | 用函数指针调用目标函数 |
原书图 21.1.1:USMART 组件框图
21.2 硬件设计
复用 USART1(PA9/PA10) + LED0/LED1 + 蜂鸣器。
21.3 程序设计
21.3.1 注册函数
USMART 工具支持参数识别:基础类型自动解析,结构体/指针需手动指定。
// 注册函数列表
void *usmart_nametab[] = {
(void *)led0, "led0",
(void *)beep, "beep",
(void *)test, "test",
};
// 函数表:参数类型字符串
struct usmart_fun usmart_funtbl[] = {
{led0, "void led0(u8 x)"},
{beep, "void beep(void)"},
{test, "void test(u8 a, u16 b)"},
};
21.3.2 使用步骤
- 串口接收完整命令字符串(CR/LF 结尾);
- USMART 解析函数名 + 参数;
- 查注册表找到函数指针;
- 调用。
原书图 21.3.2.1:USMART 解析流程图
21.4 下载验证
串口助手输入 led0(1) → LED0 亮;输入 beep() → 蜂鸣器响;输入 help → 列出所有可用函数。
调试利器:把 PID 控制参数、波形数据用 USMART 暴露给串口,无需重新烧录就能改值。
原书图 21.4.1:串口助手调用 USMART 命令
USMART 是基于什么实现的?
函数指针 + 串口命令解析。
串口命令以什么字符结尾触发?
回车换行 (\r\n)。
调用
led0(1)后 LED 状态?调用
led0(1),由 led0 函数实现决定(亮或灭)。