|
楼主 |
发表于 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码传送数据的基本方式
虽然这个问题很小,有的人一思考便知晓其中的内涵,但是我开始接触这个,想破脑壳也想不出来
中午和实验室哥们讨论问题的时候,受了师兄启发,茅塞顿开
这段程序很多书上都是,确实很好,当时我还以为是个错误程序,现在觉得是我错了 |
|