STC51和STM32使用串口输出中文乱码问题解决
问题描述:在进行串口实验时,我们想通过串口调试助手来输出中文信息, 但是我们经常会发现在串口调试助手上会输出乱码,跟我们预期的中文信息不符,见以下图片:
解决思路:
1、检查软件串口波特率设置和串口调试助手的波特率设置是否一致;
2、软件串口波特率计算不是整数,跟串口调试助手就难以沟通,所以软件内部波特率最好设置为整数;
3、软件串口输出现在基本上都不设置流控制和校验位,所以串口调试助手不能设置校验位和流控制;
4、串口调试助手有问题,我们可以利用多种串口调试助手去测试,我这边推荐了3个串口调试助手:普中ISP中自带的串口调试助手(通讯效果上会差点,时不时会出现一两个错误字符)、sscom32、SecureCRT,如果都是乱码,说明不是串口调试助手的问题。
5、项目工程损坏(这个问题的出现是我以文件夹的形式存放在百度云中,后来下载工程重新编译后hex文件有问题),需要重新创建工程,再进行编译;
6、集成开发环境IDE的版本过低,我们这里的开发环境是keil4,如果不是keil4版本的希望升级到这个版本或更高版本;
7、项目文件夹中找到main.c文件,注意该文件的编码格式需要选择ANSI编码(原来默认的是UTF-8),可以通过记事本打开,然后保存另存为的方式来修改编码格式;
以上就是我们解决串口输出乱码的基本思路。
下面展示一些
串口打印中文示例
。
/**************************************************************************************
实验现象:下载程序后打开串口调试助手,将波特率设置为4800
接线说明:USB下载线-CH340
注意事项:
***************************************************************************************/
#include "reg51.h" //此文件中定义了单片机的一些特殊功能寄存器
#include "stdio.h"
//函数声明
void uartinit(void);
void uart_send_byte(unsigned char c);
void uart_send_string(unsigned char* str);
void delay(void);
void main(void)
{
uartinit();
while(1)
{
uart_send_string("耿璐小课堂");
delay();
}
}
//串口初始化函数
//预设一个串口条件:8数据位、1停止位、0校验位、波特率4800
//初始化的主要工作就是去设置相关的寄存器
void uartinit(void)
{
SCON=0x50; //设置为工作方式1(8位串口),允许接收
PCON=0x80; //波特率加倍
//通信波特率相关设置
TMOD=0x20; //设置定时器T1为模式2
TH1=243;
TL1=243; //8位自动重装,TH1用完了之后下一个周期TL1会自动重装到TH1去
TR1 = 1; //开始T1让它开始工作
}
void uart_send_byte(unsigned char c)
{
SBUF = c;
//第二步,先确认串口发送部分没有在忙
while(!TI);
//第三步,软件复位TI标志位
TI=0;
}
void uart_send_string(unsigned char* str)
{
while (*str != '\0')
{
uart_send_byte(*str);
str++;
}
}
void delay(void)
{
unsigned char i, j;
for (i=0; i<100; i++)
for (j=0; j<100; j++);
}
这里我出现的打印英文字符没问题,打印中文就出现乱码,这里基本就可以定位为编码格式问题,我们可以利用第6条思路去解决。
1.首先在你的文件中找到main.c文件,然后使用记事本打开,然后保存另存为,选择ANSI编码(原来默认的是UTF-8),替换原来文件。
2、然后重新编译工程,下载到开发板,再打开串口调试助手,然后我们发现问题已经解决。
这么看来,我的问题已经解决,其他思路我也不用在这里用具体示例来赘述了,因为问题都是多种多样的,但如何去处理,我们的心里必须要有一套解决思路,这样我们就可以将出现问题的原因范围慢慢缩小,直到大家能够捕捉到它!