0
问答首页 最新问题 热门问题 等待回答标签广场
我要提问

单片机

单片机串口通信中文时易出现乱码

/***************************************************************************************/

#include "reg52.h"

#define uchar unsigned char

#define uint unsigned int

#define error 0

uchar flag;

uchar temp;                                       

/***************************/

void delay(uint z)

{

        uint x,y;

        for(x=0;x<110;x++)

                for(y=0;y}

/*********串口初始化*******/

void Uart_Init(void)                //9600bps@12.000MHz

{

        PCON &= 0x7F;                //波特率不倍速

        SCON = 0xD0;                //8位数据,可变波特率

        TMOD &= 0x0F;                //清除定时器1模式位

        TMOD |= 0x20;                //设定定时器1为8位自动重装方式

        TL1 = 0xFD;                //设定定时初值

        TH1 = 0xFD;                //设定定时器重装值

        ET1 = 0;                //禁止定时器1中断

        TR1 = 1;                //启动定时器1

}

/********发送一个字节****/

void Uart_SendByte(uchar dat)   //9位 (1校验位)

{

        ACC=dat;

        TB8=P;

        SBUF=dat;

        while(TI==0);

        TI=0;       

}

/**************************/

void Uart_SendStr(uchar *s)

{       

        uchar i;

        for(i=0;s[i]!='\0';i++)

        {

                ACC=s[i];

                TB8=P;

                SBUF=s[i];

                while(TI==0);

                TI=0;

        }

        delay(800);

}

/*************************/

uchar Uart_Receive()

{

        uchar dat,buf;

        if(RI==1)

        {       

                dat=SBUF;

                ACC=dat;

                if(RB8==P)

                {

                        buf=dat;

                        RI=0;

                        return buf;

                }

                else

                {

                    RI=0;

                    return error;

                 }

        }

}

/*******************/

void main()

{       

    Uart_Init();

        ES=1;

        EA=1;

        while(1)

        {

                Uart_SendStr("狂奔的蜗牛哥 !");

                Uart_SendStr("\n");

                delay(5000);

                Uart_SendStr("START.......");

                delay(5000);

        }

}

/************串口中断*****************/

void Uart_ser()interrupt 4

{

                temp=Uart_Receive();;

}

单片机串口通信中文时易出现乱码?求大神指点!

提问者:szoldman 地点:- 浏览次数:4418 提问时间:10-22 17:40
我有更好的答案
提 交
6条回答
cmh14 06-07 17:29 回答数:0 被采纳数:0
波特率精度不够,换11.0592MHz的晶体。
Lotus_Ching 06-11 13:49 回答数: 被采纳数:
换个串口助手,略微修改下波特率的设置参数试试~
卧听桃花雨 06-06 10:43 回答数: 被采纳数:
都是串口调试助手惹的祸。
发英文数字是单个字节的,中文是双字节的。发中文时识别到头尾就能看到正常的文字,没识别到就乱码了。
没玩上位机编程,上面如何识别就不知道了。
jenny042 06-12 12:40 回答数:0 被采纳数:0
如果是中文偶然总会有几个乱码,那或许是波特率误差,但如果是凡是中文就乱码,那是字符集问题。简单的文本,也蕴含着复杂的关系,文本不简单。

当你在keil中输入文字的时候,双引号中的字符串,根据你在keil里的字符集设置而不同。你在编辑器里看到的相同的中文,字符集不同,它在内存中存放的实际数据也就不同。转到别的东西上显示的时候,如果没有用对应的字符集来解释,那就是乱码。

所以,你可以看看你用的串口助手能不能支持你的字符集。好的串口工具是可以设置字符集。

而偶尔乱码的,我估计,是误差率问题,时钟频率不是波特率整数的,在n个波特之后会发生错位,周期性失衡。
schumi_LYQ 06-06 07:50 回答数:0 被采纳数:0
每一行的尾部加二个回车符。
路交汇处 06-10 17:21 回答数: 被采纳数:
串口只是单个字节奇偶校验,不能保证100%正确。看你目的是什么,可以数据包加校验来保证传输质量,错误的丢弃
撰写答案
提 交
1 / 3
1 / 3
相关单片机
具有音调控制的单片机立体声前置放大器
用于单片机与电子装置中的开关电源
单片机软硬件复位的条件都有啥
电动机的单片机控制
单片机应用系统开发实例导航