stm32cubmx多串口printf
该文章仅适用于stm32cubmx+MDK-ARM编程
printf作为c语言标准输出接口,而在stm32上usart串口用transmit函数发送给终端,这就很不舒服。这个时候要用到printf重定向:
在usart.c
顶部包含#include<stdio.h>
在usart.c
结尾处,/* USER CODE BEGIN 1 */重写fget和fput函数。
int fputc(int ch, FILE *f) //重定向printf函数
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
int fgetc(FILE *f) //重定向getchar,scanf函数
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
return ch;
}
这样就能直接用printf输出到串口1了。
这几天做了个项目,有很多模块需要与单片机串口通信,如GPS模块,串口屏等,这就需要多个串口与它们连接。这个时候要发送数据给某个串口printf重定向就不适用了。
当然,我们可以用transmit函数来指定发送给哪个串口,不过还要用sprintf格式化到字符串,比较麻烦。
我们只需要:
usart.c
顶部包含#include <stdarg.h>
和宏#define TXBUF_SIZE_MAX 100
并将以上代码改为:
void uartx_printf(const char *format, ...)
{
va_list args;
uint32_t length;
uint8_t txbuf[TXBUF_SIZE_MAX] = {0};
va_start(args, format);
length = vsnprintf((char *)txbuf, sizeof(txbuf), (char *)format, args);
va_end(args);
HAL_UART_Transmit(&huartx, (uint8_t *)txbuf, length, HAL_MAX_DELAY);
memset(txbuf, 0, TXBUF_SIZE_MAX);
}
其中x为串口号,表示要发送给哪个串口。
调用如:
usart1_printf("%d\n",a);
发送a的值给串口1。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!