你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

使用 HAL_UART_Transmit_IT() 实现 printf

[复制链接]
patch1582 提问时间:2026-8-7 09:52 / 未解决

该如何用HAL_UART_Transmit_IT()实现 UART 上的 printf 输出。 下面是阻塞版本,工作正常:

void PRINT_MESG_UART(const char format, ... ) { va_list ap; uint8_t buffer [128]; int n; va_start(ap, format); n = vsnprintf ((char)buffer, 128, format, ap); va_end(ap); if(HAL_UART_Transmit(&UartHandle, (uint8_t)buffer, n, 300) != HAL_OK) { Error_Handler(); } } 现在希望改成非阻塞、基于中断发送。我写了下面代码: uint8_t buffer [128]; void PRINT_MESG_UART(const char format, ... ) { va_list ap; int n;

while (UartHandle.gState != HAL_UART_STATE_READY);

va_start(ap, format); n = vsnprintf ((char)buffer, 128, format, ap); va_end(ap); HAL_UART_Transmit_IT(&UartHandle, (uint8_t)buffer, n); } 可以跑,但缺点明显:UART 处于发送状态时,函数依然会原地阻塞自旋等待,算不上真正非阻塞。 理想方案是传统的软件环形发送缓冲区,逐个字节入环,直接操作 TXE 中断标志:

bool u_put_byte(uint8_t data) { bool ok = FALSE; if ((uart_buffer.txin + 1) % S_BUF_SIZE != uart_buffer.txout) { uart_buffer.txbuf[uart_buffer.txin] = data; uart_buffer.txin = (uart_buffer.txin + 1) % S_BUF_SIZE; ok = TRUE; } SET_BIT(UartHandle.Instance->CR1, USART_CR1_TXEIE); return ok; }

void PRINT_MESG_UART(const char format, ... ) { va_list ap; uint8_t buffer[S_BUF_SIZE]; int n; va_start(ap, format); n = vsnprintf ((char)buffer, S_BUF_SIZE, format, ap); va_end(ap); int i = 0; while ((buffer[i] != 0) && (i < S_BUF_SIZE) && (i < n)) { while (!u_put_byte(buffer[i])); i++; } } 但是 HAL 库 UART 接口,并不直接支持这种底层环形缓冲区的工作模式。

收藏 评论2 发布时间:2026-8-7 09:52

举报

2个回答
DazzlingOkami 回答时间:2 小时前

你实现的PRINT_MESG_UART基本是正确的,但最后的数据需要放入到一个环形缓存区中。

放入缓存区中后,检查当前串口是否busy,如果是空闲状态,则取出一个字节使用中断模式发送。如果是繁忙状态则不处理函数直接返回。

在串口中断中,从缓存区中取出一个字节再调用HAL_UART_Transmit_IT发送,这样每发送完成一个字节就触发一次中断并触发下一次传输,最终实现连续数据传输。

如果学会了这种做法,还可以尝试配合DMA实现更高效的链式数据传输,效率更高。

STMWoodData 回答时间:1 小时前

可以参考我这个https://shequ.stmicroelectronics.cn/thread-871151-1-1.html

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版