版本:0.1 | 日期:2026-07-03 | 路径: platforms/components/xtiny/xt_hal/
一、概述
xt_hal_uart 是 XTINY HAL 层的 UART 驱动模块,提供串口初始化、关闭、三种发送模式(阻塞/零拷贝/流式)、流式接收和缓冲区管理。所有平台都必须实现此模块。
1.1 设计原则
- 发送多模式 :提供阻塞、零拷贝和流式三种发送方式,覆盖不同实时性和内存需求
- 缓冲区独立管理 :收发缓冲区由用户分配并通过 set_rx_buf / set_tx_buf 注入,模块不内部分配
- 回调驱动接收 :数据到达和发送完成通过回调通知上层,不阻塞任务
- 预设配置宏 :通过 XT_HAL_UART_8N1 等预设宏简化常见串口参数配置
1.2 依赖
二、核心概念
2.1 预设配置
UART 参数(数据位、校验、停止位)通过预设宏打包为一个 uint32_t 值传入 setup :
也可通过 XT_HAL_UART_PRESET(_word, _parity, _stop) 宏自定义组合。
2.2 三种发送模式
2.3 初始化顺序
必须按以下顺序调用:
- xt_hal_uart_set_rx_buf — 设置接收缓冲区(在 setup 前)
- xt_hal_uart_set_tx_buf — 设置发送缓冲区(如需流式/零拷贝发送)
- xt_hal_uart_set_cb — 设置回调(可选)
- xt_hal_uart_setup — 初始化 UART 硬件
2.4 回调事件
三、API 参考
以下为函数签名大纲,完整的参数说明、返回值、注意事项请查看 xt_hal_uart(UART 驱动) 。
3.1 生命周期
3.2 缓冲区配置
3.3 回调
3.4 数据收发
3.5 缓冲区状态
3.6 类型
四、常见模式
4.1 阻塞发送(最简单)
void uart_send_hello(void) {
}
int32_t xt_hal_uart_tx_block(uint8_t uart_id, const void *tx_buffer, size_t size)
阻塞发送
xt_err_t xt_hal_uart_close(uint8_t uart_id)
关闭 UART
xt_err_t xt_hal_uart_setup(uint8_t uart_id, uint32_t preset, uint32_t baudrate, uint8_t tx_pin, uint8_t rx_pin)
初始化 UART
4.2 流式接收——回调驱动
static uint8_t rx_buf[256];
static void uart_cb(uint8_t uart_id, uint32_t event_id) {
uint8_t data[64];
if (len > 0) {
}
}
}
void uart_rx_init(void) {
}
int32_t xt_hal_uart_rx(uint8_t uart_id, void *rx_buffer, size_t size)
流式非阻塞接收
xt_err_t xt_hal_uart_set_rx_buf(uint8_t uart_id, void *buffer, size_t size)
设置接收缓冲区
xt_err_t xt_hal_uart_set_cb(uint8_t uart_id, xt_hal_uart_cb_t cb)
设置 UART 回调函数
4.3 流式发送——非阻塞
static uint8_t tx_buf[512];
void uart_stream_init(void) {
}
void uart_send_data(const uint8_t *data, size_t len) {
if (wrote < (int32_t)len) {
}
}
xt_err_t xt_hal_uart_set_tx_buf(uint8_t uart_id, void *buffer, size_t size)
设置发送缓冲区
int32_t xt_hal_uart_tx(uint8_t uart_id, const void *tx_buffer, size_t size)
流式非阻塞发送
五、已知行为与限制
| 行为 | 说明 |
| rx_buf 必须在 setup 前设置 | 初始化后设置无效 |
| tx_buf 用于流式/零拷贝 | 仅 tx_block 不需要 tx_buf |
| tx 可能只写入部分数据 | 返回实际写入字节数,需检查 |
| tx_0copy 使用中不可复用 buffer | 需等待 XT_HAL_UART_EVENT_TX_DONE 回调 |
| tx_block 阻塞当前任务 | 实时性敏感场景使用流式发送替代 |