由此可以看出,数据包一共有6个字节,start_bit,transmission,commond共用一个字节,
这个时候初学者可能会这样定义位域:
struct _CMD_
{
unsigned char start_bit : 1;
unsigned char transmission : 1;
unsigned char commond :6;
unsigned char argument[4];
unsigned char crc_7 : 7;
unsigned char end_bit : 1;
};
大体一看。没错啊,就是这样啊!!可惜,这样是不对的,我在DEV-C++编译器上测试过,这样定义的话到最会有的苦头吃;在DEV-C++上,编译器
是这样把那一个字节给分配出来的:先分配低位地址,在struct _CMD_中,start_bit是第一位,所以,编译器先把那一个字节的最低位给
start_bit,把次低位分配给transmission,剩下的高六位给commond。我们再来看看上面那个图,start_bit是最高位,
所以,这样定义就会使得高低位混了,我们应该按照下面的方式定义:
typedef struct _CMD_
{
unsigned char commond : 6;
unsigned char transmission : 1;
unsigned char start_bit : 1;
unsigned char argument[4] ;
unsigned char end_bit : 1;
unsigned char crc_7 : 7;
}SD_CMD;
这样定义完后,start_bit就会成为最高位了。前提是发送数据包时先发送低位地址
以上是我以前的分析,现在又有了新的理解:
结构体和位域都是先分配低位地址的,也就是说,先定义的数据被分配到低位地址上,后定义的分配到高位地址上,以上的例子可以写为:
typedef struct _CMD_
{
unsigned char end_bit : 1;
unsigned char crc_7 : 7;
unsigned char argument[4] ;
unsigned char commond : 6;
unsigned char transmission : 1;
unsigned char start_bit : 1;
}SD_CMD;
这样,发送数据包的时候只要先发送高位地址就可以了
还有一点,封包发送需要用到指针的强制转换