使用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
相关产品推荐
相关产品推荐

