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

[复制链接]
3495|20
 楼主| 狂奔的蜗牛哥 发表于 2014-4-22 23:31 | 显示全部楼层 |阅读模式
/***************************************************************************************/
#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<z;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();;
}
单片机串口通信中文时易出现乱码?求大神指点!
 楼主| 狂奔的蜗牛哥 发表于 2014-4-22 23:32 | 显示全部楼层
自己顶!!!:lol
chunyang 发表于 2014-4-22 23:52 | 显示全部楼层
波特率精度不够,换11.0592MHz的晶体。
 楼主| 狂奔的蜗牛哥 发表于 2014-4-23 00:02 | 显示全部楼层
chunyang 发表于 2014-4-22 23:52
波特率精度不够,换11.0592MHz的晶体。

用的是11.0592M的
 楼主| 狂奔的蜗牛哥 发表于 2014-4-23 00:02 | 显示全部楼层
chunyang 发表于 2014-4-22 23:52
波特率精度不够,换11.0592MHz的晶体。

就是用的11.0592MHz的
cjseng 发表于 2014-4-23 01:04 | 显示全部楼层
不清楚原因,可能是串口调试助手的原因,我也发现过,换不同的调试工具,结果会正常,实际通讯也正常。
df_flying 发表于 2014-4-23 08:58 | 显示全部楼层
换个串口助手,略微修改下波特率的设置参数试试~
 楼主| 狂奔的蜗牛哥 发表于 2014-4-23 09:53 | 显示全部楼层
df_flying 发表于 2014-4-23 08:58
换个串口助手,略微修改下波特率的设置参数试试~

好的!
 楼主| 狂奔的蜗牛哥 发表于 2014-4-23 09:54 | 显示全部楼层
cjseng 发表于 2014-4-23 01:04
不清楚原因,可能是串口调试助手的原因,我也发现过,换不同的调试工具,结果会正常,实际通讯也正常。 ...

好的,谢谢
pang3dsa 发表于 2014-4-23 11:13 | 显示全部楼层
都是串口调试助手惹的祸。
发英文数字是单个字节的,中文是双字节的。发中文时识别到头尾就能看到正常的文字,没识别到就乱码了。
没玩上位机编程,上面如何识别就不知道了。
江枫渔火 发表于 2014-4-23 11:58 | 显示全部楼层
如果是中文偶然总会有几个乱码,那或许是波特率误差,但如果是凡是中文就乱码,那是字符集问题。简单的文本,也蕴含着复杂的关系,文本不简单。

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

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

而偶尔乱码的,我估计,是误差率问题,时钟频率不是波特率整数的,在n个波特之后会发生错位,周期性失衡。
grasswolfs 发表于 2014-4-23 12:05 | 显示全部楼层
字节数是多少?大段传输么?
 楼主| 狂奔的蜗牛哥 发表于 2014-4-23 12:59 | 显示全部楼层
grasswolfs 发表于 2014-4-23 12:05
字节数是多少?大段传输么?

如程序所述
grasswolfs 发表于 2014-4-23 14:00 | 显示全部楼层
狂奔的蜗牛哥 发表于 2014-4-23 12:59
如程序所述

易出现的意思是每次都出现,还是什么样的概率?
 楼主| 狂奔的蜗牛哥 发表于 2014-4-23 19:15 | 显示全部楼层
grasswolfs 发表于 2014-4-23 14:00
易出现的意思是每次都出现,还是什么样的概率?

偶尔出现,频率不是太高
handlike 发表于 2014-4-23 21:26 | 显示全部楼层
每一行的尾部加二个回车符。
我是黄宇轩 发表于 2014-4-23 22:09 | 显示全部楼层
不懂帮顶
zhenjiang7412 发表于 2014-4-23 23:03 来自手机 | 显示全部楼层
串口只是单个字节奇偶校验,不能保证100%正确。看你目的是什么,可以数据包加校验来保证传输质量,错误的丢弃
grasswolfs 发表于 2014-4-24 12:03 | 显示全部楼层
grasswolfs 发表于 2014-4-23 14:00
易出现的意思是每次都出现,还是什么样的概率?

可以稍微用matlab之类的评估一下误码率,串口传输还是可能有误码的,如果传输数据为了稳定,可以crc校验
 楼主| 狂奔的蜗牛哥 发表于 2014-4-24 12:35 | 显示全部楼层
grasswolfs 发表于 2014-4-24 12:03
可以稍微用matlab之类的评估一下误码率,串口传输还是可能有误码的,如果传输数据为了稳定,可以crc校验 ...

好的,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

86

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部