当前位置: 代码迷 >> 单片机 >> 用51io口模拟串口的有关问题
  详细解决方案

用51io口模拟串口的有关问题

热度:20   发布时间:2016-04-28 15:09:52.0
用51io口模拟串口的问题
我想用模拟串口收发汉字和字母,并在串口调试上显示,可是,如何判断收发的是汉字还是字母,如何判断一个汉字的两个字节哪个是首字节哪个是尾字节?

------解决方案--------------------
汉字内码由两个字节组成,这两个字节最高位都是1,引文字母内码由一个字节组成,最高位是0。
写程序时,读到的就是内码。比如“a中”,a的内码是0x61,中内码是0xd6, 0xd0。
比如一个字符串str,你可以如下判断:
while(*str)
{
    if(*str & 0x80)   // 汉字
    {
        str++;
        // 把后面的字节*str也读出来,就可以组成一个汉字
    }
    else
    {
        // 英文字母,读取
    }
    
    str++;
}

------解决方案--------------------
引用
可是你如何区分高位是1的十六进制数和汉字的字节呢,他们高位都是1呀

本来就是处理字符串的,我的理解是你春口收到一串字符串,要把他转成字符显示出来。就是我说的那样转换的,高位为1,但又不是汉字的显示出来就是乱码。很多串口调式终端都是要嘛二进制方式显示,要嘛就是字符显示,如果不是英文也不是汉字,显示出来就是乱码。
------解决方案--------------------
引用:
Quote: 引用:

汉字内码由两个字节组成,这两个字节最高位都是1,引文字母内码由一个字节组成,最高位是0。
写程序时,读到的就是内码。比如“a中”,a的内码是0x61,中内码是0xd6, 0xd0。
比如一个字符串str,你可以如下判断:
while(*str)
{
    if(*str & 0x80)   // 汉字
    {
        str++;
        // 把后面的字节*str也读出来,就可以组成一个汉字
    }
    else
    {
        // 英文字母,读取
    }
    
    str++;
}



可是你如何区分高位是1的十六进制数和汉字的字节呢,他们高位都是1呀


如果仅仅是字母和汉字,直接根据字符的编码对应解码就可以了,任何字符编码在解码过程中都不可能出现歧义.
参考
字符编码

如果收发内容包括汉字,字母,和十六进制数字,那么请你自己编写一个通信协议,用以区分那些是字符那些是"数".
  相关解决方案