打印

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

[复制链接]
2963|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
/***************************************************************************************/
#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的

使用特权

评论回复
5
狂奔的蜗牛哥|  楼主 | 2014-4-23 00:02 | 只看该作者
chunyang 发表于 2014-4-22 23:52
波特率精度不够,换11.0592MHz的晶体。

就是用的11.0592MHz的

使用特权

评论回复
6
cjseng| | 2014-4-23 01:04 | 只看该作者
不清楚原因,可能是串口调试助手的原因,我也发现过,换不同的调试工具,结果会正常,实际通讯也正常。

使用特权

评论回复
7
df_flying| | 2014-4-23 08:58 | 只看该作者
换个串口助手,略微修改下波特率的设置参数试试~

使用特权

评论回复
8
狂奔的蜗牛哥|  楼主 | 2014-4-23 09:53 | 只看该作者
df_flying 发表于 2014-4-23 08:58
换个串口助手,略微修改下波特率的设置参数试试~

好的!

使用特权

评论回复
9
狂奔的蜗牛哥|  楼主 | 2014-4-23 09:54 | 只看该作者
cjseng 发表于 2014-4-23 01:04
不清楚原因,可能是串口调试助手的原因,我也发现过,换不同的调试工具,结果会正常,实际通讯也正常。 ...

好的,谢谢

使用特权

评论回复
10
pang3dsa| | 2014-4-23 11:13 | 只看该作者
都是串口调试助手惹的祸。
发英文数字是单个字节的,中文是双字节的。发中文时识别到头尾就能看到正常的文字,没识别到就乱码了。
没玩上位机编程,上面如何识别就不知道了。

使用特权

评论回复
11
江枫渔火| | 2014-4-23 11:58 | 只看该作者
如果是中文偶然总会有几个乱码,那或许是波特率误差,但如果是凡是中文就乱码,那是字符集问题。简单的文本,也蕴含着复杂的关系,文本不简单。

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

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

而偶尔乱码的,我估计,是误差率问题,时钟频率不是波特率整数的,在n个波特之后会发生错位,周期性失衡。

使用特权

评论回复
12
grasswolfs| | 2014-4-23 12:05 | 只看该作者
字节数是多少?大段传输么?

使用特权

评论回复
13
狂奔的蜗牛哥|  楼主 | 2014-4-23 12:59 | 只看该作者
grasswolfs 发表于 2014-4-23 12:05
字节数是多少?大段传输么?

如程序所述

使用特权

评论回复
14
grasswolfs| | 2014-4-23 14:00 | 只看该作者
狂奔的蜗牛哥 发表于 2014-4-23 12:59
如程序所述

易出现的意思是每次都出现,还是什么样的概率?

使用特权

评论回复
15
狂奔的蜗牛哥|  楼主 | 2014-4-23 19:15 | 只看该作者
grasswolfs 发表于 2014-4-23 14:00
易出现的意思是每次都出现,还是什么样的概率?

偶尔出现,频率不是太高

使用特权

评论回复
16
handlike| | 2014-4-23 21:26 | 只看该作者
每一行的尾部加二个回车符。

使用特权

评论回复
17
我是黄宇轩| | 2014-4-23 22:09 | 只看该作者
不懂帮顶

使用特权

评论回复
18
zhenjiang7412| | 2014-4-23 23:03 | 只看该作者
串口只是单个字节奇偶校验,不能保证100%正确。看你目的是什么,可以数据包加校验来保证传输质量,错误的丢弃

使用特权

评论回复
19
grasswolfs| | 2014-4-24 12:03 | 只看该作者
grasswolfs 发表于 2014-4-23 14:00
易出现的意思是每次都出现,还是什么样的概率?

可以稍微用matlab之类的评估一下误码率,串口传输还是可能有误码的,如果传输数据为了稳定,可以crc校验

使用特权

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

好的,谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

86

帖子

3

粉丝