跳转至

UART 控制指令

对应源码: components/airlink/include/luat_airlink_drv_uart.h, components/airlink/src/driver/luat_airlink_drv_uart.c

启用宏: LUAT_USE_AIRLINK_EXEC_UART (主指令), LUAT_USE_DRV_UART (回调)

UART 指令用于在两端之间透明地操作 UART 接口, 例如让 Air8101 通过 Air780EPM 的辅助 UART 接 GNSS 模块.

通用 payload 头

所有 driver 指令的 data 字段前 8 字节是 seq_id (uint64_t, 小端, 单调递增), 用于匹配 cmd 0x08 result 回调. 详见 指令层描述.

指令列表

cmd 名称 方向 说明
0x400 uart_setup 主→从 配置 UART (波特率/数据位/停止位等)
0x401 uart_write 主→从 向 UART 发送数据 (按 1535B 分段)
0x402 uart_close 主→从 关闭 UART
0x410 uart_data_cb 从→主 UART 接收到数据的回调
0x411 uart_sent_cb 从→主 UART 发送完成的回调

各指令详细定义

uart_setup (0x400)

配置 UART.

字段 长度 含义
seq_id 8B 序列号
uart_conf NB luat_uart_t 结构 (含 id/baud_rate/data_bits/stop_bits/parity 等)

引用源码头文件 include/luat_uart.h 中的 luat_uart_t 结构定义.

uart_write (0x401)

向 UART 发送数据.

字段 长度 含义
seq_id 8B 序列号
uart_id 1B UART id
data NB 写入数据

分段: 客户端自动按 1535 字节分段, 避免单次过大 (src/driver/luat_airlink_drv_uart.c:36-61).

size_t segment_size = 1535;
while (remaining > 0) {
    size_t chunk = (remaining > segment_size) ? segment_size : remaining;
    // 构造 cmd 0x401, 长度 = chunk + 1 + 8
    // 入队, 累计 sent_total
}

RPC 模式注意: 在 RPC 模式下, luat_airlink_drv_uart_write() 必须循环调用 nb_call 直到所有数据发送完毕 (每次最多 UART_WRITE_RPC_MAX = 500 字节), 不能依赖单次调用 (AGENTS.md:147-149).

uart_close (0x402)

关闭 UART.

字段 长度 含义
seq_id 8B 序列号
uart_id 1B UART id

uart_data_cb (0x410)

UART 接收到数据的回调. 响应方向 (从→主).

字段 长度 含义
uart_id 1B UART id
data NB 接收到的数据

特殊处理: uart_id 10-19 在从机端被映射为内部缓冲 0-9 (用于 GNSS 等场景), 4096 字节环形缓冲, 满则丢弃旧数据保留新数据 (src/driver/luat_airlink_drv_uart.c:90-129).

uart_sent_cb (0x411)

UART 发送完成的回调. 响应方向 (从→主).

字段 长度 含义
uart_id 1B UART id
问一下 AI