跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
  • 世界
  • 用户
  • 群组
  • 游戏大厅
  • 工具箱
  • 连载
皮肤
  • 浅色
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • 深色
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Potatochip Light
  • Potatochip Dark
折叠
品牌标识

potato CHIP

  1. 主页
  2. STM32
  3. STM32 UART 串口通信:printf 重定向与中断接收(示例帖)

STM32 UART 串口通信:printf 重定向与中断接收(示例帖)

已定时 已固定 已锁定 已移动 STM32
1 帖子 1 发布者 4 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • A
    A
    admin
    编写于 最后由 编辑
    #1

    串口是 STM32 调试的生命线:打印日志、看传感器数据、跟上位机联调都靠它。这篇把最常用的两招讲透:printf 重定向输出,中断方式接收。

    1. CubeMX 配置要点

    • Connectivity → USART1,Mode 选 Asynchronous
    • 波特率 115200,8 数据位、无校验、1 停止位(8N1)
    • NVIC Settings 里勾选 USART1 global interrupt(中断接收才需要)
    • PA9(TX)、PA10(RX)接到 USB 转串口模块,注意 TX 接 RX、RX 接 TX,交叉接

    2. printf 重定向

    C 库的 printf 最终调 fputc,重写它把字符送进串口:

    #include <stdio.h>
    
    int fputc(int ch, FILE *f) {
        HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
        return ch;
    }
    
    // main 里直接用
    printf("system clock: %lu Hz\r\n", HAL_RCC_GetSysClockFreq());
    

    注意两点:

    • printf 发 \n 不会自动回车,串口助手里看到满屏阶梯状就改成 \r\n
    • HAL_MAX_DELAY 是阻塞等待,放在中断里调 printf 会卡死,中断里只做标记

    3. 中断接收(推荐做法)

    轮询接收会堵住主循环,用中断 + 一字节缓冲:

    uint8_t rx_byte;
    uint8_t rx_buf[128];
    uint8_t rx_len = 0;
    
    void start_uart_rx(void) {
        HAL_UART_Receive_IT(&huart1, &rx_byte, 1); // 启动一次
    }
    
    // 每收到 1 字节进一次回调,记得重新挂起下一次接收
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
        if (huart->Instance == USART1) {
            if (rx_byte == '\n' || rx_len >= sizeof(rx_buf) - 1) {
                rx_buf[rx_len] = '\0';
                // 在这里处理一行命令,不要做耗时操作
                rx_len = 0;
            } else if (rx_byte != '\r') {
                rx_buf[rx_len++] = rx_byte;
            }
            HAL_UART_Receive_IT(&huart1, &rx_byte, 1); // 关键:重新挂起
        }
    }
    

    4. 排障清单

    现象 先查
    串口无输出 波特率两边是否一致;TX/RX 是否交叉接;GND 有没有共地
    输出乱码 波特率/时钟配置,检查 HSE 是否起振
    只能收一次 回调里有没有重新调 HAL_UART_Receive_IT
    printf 卡死 是否在中断上下文里调用;串口外设时钟开了没

    下一篇计划写定时器 PWM 驱动舵机/电机,连载目录见 /series。

    1 条回复 最后回复
    0

    你好!看起来您对这段对话很感兴趣,但您还没有一个账号。

    厌倦了每次访问都刷到同样的帖子?您注册账号后,您下次访问时都将自动回到上次浏览的位置,并可选择接收新回复的通知(通过电子邮件或推送通知)。您还可以收藏帖子、为帖子点赞,以此向其他社区成员表达您的感谢。

    有了你的建议,这篇帖子会更精彩哦 💗

    注册 登录
    回复
    • 在新帖中回复
    登录后回复
    • 从旧到新
    • 从新到旧
    • 最多赞同


    • 登录

    • 没有帐号? 注册

    • 登录或注册以进行搜索。
    Powered by NodeBB Contributors
    • 第一个帖子
      最后一个帖子
    0
    • 版块
    • 最新
    • 标签
    • 热门
    • 世界
    • 用户
    • 群组
    • 游戏大厅
    • 工具箱
    • 连载