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。

posted @ 2022-04-02 23:09  QHWYX  阅读(252)  评论(0编辑  收藏  举报