我们在读写串口通信的时候往往要去读一些通信的协议规定。这次我碰到的是ABT公司的RFID读卡器。。具体的数据格式如下所转述:
读卡器连续输出8个字节的数据,组成一个数据帧.(8字节=8*8位 )读卡器的输出数据格式符合如下的帧格式:
帧头AA:8位:
读卡器号:8位;
状态字:4位+类别号:4位;
卡号:24位;
效验和:8位;
尾帧:8位;
读懂这个协议真的非常重要,就像一把钥匙,通往了潘多拉。。。。
我的电脑是32位机,在linux下使用一个测试程序,
void main()
{
printf("%d", sizeof(char));
}
得到的结果是1。。。 char型是一个字节。是8位的。。
但是我们的程序中所用的语句
read(fd, buff ,8)这个其中的8指的是什么呢。。应该是字节。。而并非是位。。这样我们先明白这个。。然后就了解这个协议的位是怎么回事。。
就是说这个是一个字节的帧头,一个字节的读卡器号,一个字节的状态字和类别号,3个字节的卡号,一个字节的校验位,一个字节的尾帧。
我们来举个我和JB昨晚上的例子,我们在将程序修改正确后,使用这个语句输出:
printf("%x/n" buff[i]);
结果刷卡后首先我们让他接受完整个一帧数据,完整的显示出来。这个数据令我吃惊,首先他是不规律的输出(除了第一帧头的数据外)
ffffffAA..其次是一些不顾律的数字。。在不停地变化-------这证明这个读卡器坏了(我这么强烈的认为)
好了我们今天的话题引出了,就是这个帧头的数字,是八位ffffffAA...16进制的数字。这个我就有些不清楚的了。
计算机中的信息都是以2进制的0和1来表示,其中每个0和1称作一个位.但是这个帧头出现的明显就不是八位了而是32位,4个字节了!!!!!
这是为什么呢?我想了想。。我们程序是以%x格式输出,那么得到的帧头和要求的AA是一至的。。即是八位的帧头。可是ffffff是什么?难道是补码???应该不是吧,后面的读卡器号之类的明显没有按照这个帧头的输出格式来输出吗。。。这个是个问题,也许是机器的问题。。。。。这个也是我工作中所遇到的一个问题。。
我们看到协议的给出是很重要的,起初我们这样理解了这个协议,8位当成了八个字节,所以程序在读取卡号的时候都是从第23--47来循环读取卡中的卡号,,这个就很失败了!!!其实是从第3-5的读取。。。。
程序很精炼,配置很复杂。。波特率,,停止位,,校验位,, 感谢我身边的舍友对我的帮准。。。。谢谢你们。。JB。。EDTE