shafei 发表于 2011-10-18 09:50:06

单片机通信之求十六进制字符串转化为字符数组的程序以及你们对程序的解释

void Hex2Byte(uchar*str,ucha*byte)
{
   uchar tmp;
   while(*str!=0)
       {
         tmp=((*str)<<4)&0xf0;
         str++;
         if(*str==0)
         {
            *byte=(tmp>>4)&0x0f;
            return;
         }
         tmp+=(*str)&0x0f;
         *byte=tmp;
         byte++;         
       }

}
这个破程序就是流行很多书籍的一个关于十六进制字符串转换成字符数组的一个小程序,
但是我怎么也看不懂,我自我反思是因为,我对单片机存储字母的方式不甚了解。如果
哪位大侠对这个比较了解,可以结合这个程序给我上一课,好吗?
万分感激

hotyong 发表于 2011-10-18 10:16:26

看错了

mcu5i51 发表于 2011-10-18 10:57:20

看不懂
十六进制字符串 和 字符数组 有什么区别,结尾的 \0 吗?

gwdong 发表于 2011-10-18 13:07:21

你的问题描述不清楚.
按我的理解,HEX应该是类似于某些工具生成的HEX文件,如果那样的话,这个程序是不正确的.

shafei 发表于 2011-10-18 14:22:58

我懂了,比如主机要发十进制数字35.
首先主机把它变成十六进制数字:0x23;即二进制数字:00100011;
好,针对二进制的数字高四位:0010,它的十六进制数字是“2”
此时我查表得“2”的ASII码是:00110010,(当然单片机是用自己的程序算出ASII码值)即(0x32)将它赋值给SBUF,发出去
然后,针对二进制的数字低四位:0011,它的十六进制数字是“3”
此时查表得“3”的ASII码是:00110011,即(0x33),然后将将它赋值给SBUF,发出去
上面这个过程就是把字符数组转换为十六进制字符串的基本过程,当然发完所有的东西以后
尾部还要发一个"\0"表示字符串结尾,上面的问题就是在这个背景下提出的
现在进入正题:
比如说,从机接受上面的数据。首先接收到的是00110010,然后接收到的是:00110011
上面的程序就是把接收这两个字节的数据,然后拼成一个字节的数据,而且这个数据就是十进制的35
我现在把程序处理数据的步骤系统说一遍
首先接收到的是00110010,这个数字算术左移四位是:00100000,然后与0xf0相与,其实还是:00100000
其次接收到的是00110011,这个数字与0x0f相与,变成:00000011
然后:00100000+00000011=00100011,正好是我们要发送的数字:十进制数字35
从这个算法中我们总结一下就是:主机会把四个bit,变成一个Byte,发出去
然后从机会把接收到的这个Byte,通过一些计算,还原成最初的那四个bit
这个就是使用十六进制ASII码传送数据的基本方式
虽然这个问题很小,有的人一思考便知晓其中的内涵,但是我开始接触这个,想破脑壳也想不出来
中午和实验室哥们讨论问题的时候,受了师兄启发,茅塞顿开
这段程序很多书上都是,确实很好,当时我还以为是个错误程序,现在觉得是我错了

donggang 发表于 2011-10-18 14:52:22

不是很懂 值得学习

yujietangying 发表于 2013-4-9 21:54:39

请问楼主用什么方式通信是用ASCII方式啊,我用串口发uint8类型数据35到串口,串口助手显示的是0x32,这是不是说明串口通信没用到你的这种方式啊??、
页: [1]
查看完整版本: 单片机通信之求十六进制字符串转化为字符数组的程序以及你们对程序的解释