STM32串口映射printf——发送中文字符乱码

文章讲述了在使用Notepad++修改代码后,STM32工程加载新代码出现中文乱码的问题。作者检查了波特率、USBMicroLIB设置和keil的编码配置,均未解决问题。最后发现是Notepad++的默认编码为UTF-8,改为ANSI编码保存后,乱码问题得到解决。提醒读者注意代码编辑器的编码设置对工程的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

        在将之前的工程使用Notepad++修改代码后,加载到现有工程中,使用串口打印输出测试串口功能,发现输出的中文字符全为乱码。对照keil设置,确保与之前工程中设置一样,莫名的就是不能输出中文字符。

解决过程

        此处串口已输出为乱码,说明移植过来的fputs代码没问题(一直在用),可以输出。下面指出可能出现乱码的几处。

        首先,检查的就是波特率,确认代码中的波特率与串口助手中的一致。

         然后,检测keil设置Usb MicroLIB确认勾选。

         再检测keil编译器的编码设置,是否为Chinese GB2312,打开方式Edit->Configration。

        以上配置都没问题,代码编写也没问题,串口输出就是乱码!

最终参考:01_STM32串口printf中文乱码解决方法_stm32printf输出文字为乱码_Tree-gg的博客-CSDN博客

         我这里使用Notepad++直接打开编辑,打开编码发现我的Notepad++默认编码为UTF-8。将编码重新改ANSI编码保存,在次下载问题解决。

 总结:

        以前也遇到过不能输出中文,或者输出中文乱码,按照前面三个点去查找修改也就解决问题了。但是之前是直接将代码复制到keil工程下修改,而此次修改代码是直接用Notepad++修改,导致编码格式放生变化。此处将几个可能出现乱码的地方进行整理,希望能够帮助到遇到同样问题的朋友。

### STM32 使用 Keil 串口输出中文乱码解决方案 当遇到 Proteus 中串口虚拟终端接收乱码的情况时,通常是因为字符编码设置不匹配或波特率配置错误所引起的。以下是详细的解决方案: #### 配置正确的波特率 确保硬件平台(STM32)、开发环境(Keil)以及仿真软件(Proteus)之间的波特率保持一致。常见的波特率为9600 bps, 115200 bps等。如果三者之间有任何一方的波特率不同步,则可能导致数据传输过程中出现误码现象。 ```c // 设置USART初始化函数中的波特率参数为115200bps void USART_Init(void){ // ...其他初始化代码... UART_HandleTypeDef huart; huart.Instance = USARTx; huart.Init.BaudRate = 115200; huart.Init.WordLength = UART_WORDLENGTH_8B; huart.Init.StopBits = UART_STOPBITS_1; huart.Init.Parity = UART_PARITY_NONE; HAL_UART_Init(&huart); } ``` #### 正确处理Unicode到GBK转换 由于大多数单片机默认支持ASCII编码,在发送多字节字符集如中文时需特别注意。对于基于GB2312/GBK编码标准的文字,每个汉字占用两个字节空间;而在某些情况下,可能还需要考虑endianness(大小端)问题[^1]。 为了实现从 Unicode 到 GBK 的正确转换并发送给上位机显示正常文字而非乱码,可以采用如下方法之一: - **使用现成库**: 如iconv库来完成UTF-8至GBK间的互转操作; - **手动编写映射表**: 对于简单的应用场景可以直接构建一张静态映射表格来进行一对一替换; - **调用RTOS自带API**(如果有): 某些实时操作系统提供了专门用于字符串编码转换的功能接口. #### 软件层面调整 在程序设计阶段应考虑到目标设备的具体需求,并据此做出相应修改。例如,通过更改printf()宏定义指向自定义打印函数的方式,使得能够兼容更多种类的数据流格式。 ```c #include <stdio.h> int fputc(int ch, FILE *f){ ITM_SendChar(ch); /* For SWO */ HAL_UART_Transmit(&huart, (uint8_t *)&ch, 1, 0xFFFF); return ch; } /* 或者重定向putchar*/ #define putchar(x) { \ char c=(char)(x); \ while(HAL_OK != HAL_UART_Transmit(&huart,(uint8_t*)&c,1,HAL_MAX_DELAY));\ } ``` 以上措施有助于改善因编码差异而导致的通信障碍情况,从而让Proteus内的串口监视器能接收到清晰可辨认的信息内容.
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值