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。