You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用printf向USB UART发送格式化字符串时出现乱码的问题

问题原因
  • 你使用的send_str函数仅适配存储在AVR Flash程序空间的字符串:函数内部通过pgm_read_byte()读取数据,该接口是AVR平台专用于读取Flash空间的API,无法正确读取RAM空间的数据。
  • 调用send_str(PSTR("\n\nHello!!!\n\n"))正常是因为PSTR()宏会将字符串存入Flash空间,匹配send_str的读取逻辑;而你格式化用的buffer是栈上分配的RAM变量,用pgm_read_byte()读取RAM地址只会拿到错误的垃圾值,就是你看到的乱码。
解决方案

最简单的处理方式是新增一个专门发送RAM中字符串的函数,保留原send_str用于Flash字符串发送:

// 新增RAM字符串发送函数
void send_str_ram(const char *s)
{
    char c;
    while (1) {
        c = *s++; // 直接读取RAM地址数据
        if (!c) break;
        usb_serial_putchar(c);
    }
}

修改main函数中buffer的发送调用即可:
将原来的send_str(buffer);替换为send_str_ram(buffer);

修改完成后即可正常输出格式化后的度数内容。

内容的提问来源于stack exchange,提问作者CaseyB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 11:39:00