动态 版块 发帖 消息 我的
Loading...
小绿叶技术博客
小绿叶技术博客
小绿叶技术Lv153   
c 语言字节和位 结构体冒号含义 结构体成员数值的写入与读取     


信号由:   名称 name + 信号的数值 status   1 开 0 关等等。

B:  Byte:  字节         8 位无符号数        范围 0-255
b:  bit:   位           二进制中每个 0 或 1 就是一个位 bit      

位说明: 从右 0 开始  向左数  最大为 7   即 0-7 表示 : 7 6 5 4 3 2 1 0  位置

#--- 编码:UTF8 ---#
1个汉字 = 3B = 3x8b    = 24b
1个字母 = 1B = 1x8b    = 8b
1个数字 = 1B = 1x8b    = 8b


计算公式: 2^N - 1 
uint8_t : 1     占用1位,0或1                 最大 1   转换2进制   1
uint8_t : 2     占用2位,0到3之间的整数       最大 3   转换2进制   11
uint8_t : 3     占用3位,0到7                 最大 7   转换2进制   111  = 2^3-1 = 8-1=7
uint8_t : 4     占用4位,0到15                最大 15  转换2进制   1111
uint8_t : 5     占用5位,0到31
uint8_t : 6     占用6位,0到63
uint8_t : 7     占用7位,0到127               在上一位的基础上 x2-1  最多只能表示 8 位二进制数 ,超过8位无效,可以换成 unit16_t 等
                                            (由 10转2进制得来长度 如 7 转2 为 111 占3位) 

data->name = (can2A5[2]&0x07);              // 最大为 111 即 7 即 0x07 但是根据矩阵表 最大为 3 即 二进制 11 模式 为  0 1 2 3  对应吹面,吹面吹脚,吹脚,吹脚吹窗,吹窗
                                            // can2A5报文中 的 第二个字节监听后 (0x07 是16进制  转换2进制为 111 占3位二进制内存 3bit)  三位二进制

data->name = (can2A5[3]&20)>>5              // 此处不是进行与计算,而 20 换算成二进制 0001 0100 占用5位二进制有效  向右移动五位,也就是去掉右边的5位,等于 第6位的结果,就是它的值  


数据类型         占用空间        表示范围                    说明
uint8_t          8b  = 1B        0 到 255                   占8位(单位 b) =  占1字节 (单位 B) 8 为由来: 255转二进制:1111 1111 为8 位
uint16_t         16b = 2B        0 到 65535                 65535  转 二进制: 1111 1111 1111 1111  正好 16 位
uint32_t         32b = 4B        0 到 4294967295
uint64_t         64b = 8B        0 到 18446744073709551615  占 64 位 = 8 字节



#------- 结构体写入和读取方法 -----------#

uint8_t eisc2F1[7];             // 定义 数组为 uint8_t  是 8位类型,但数组有8个元素(从0开始),因此 有8个 8位的类型。  因为 8位=1字节,因此该数组有8个字节大小 
typedef struct
{  
    uint8_t lock;
}eiscdataJGT;                      // 定义结构体 eiscdataJGT
extern eiscdataJGT eiscdata;       // 将结构体 eiscdataJGT 写入到内存变量结构体  eiscdata ,可以通过 eiscdata.lock 读取和赋值

eiscdataJGT eiscdata;              // 其他c文件声明结构体才能使用结构体变量

void eisc(eiscdataJGT *eisczz){    // 将结构体 继承给指针,可以通过指针方式进行读取和赋值到原结构体
    eisczz->lock = (eisc2F1[4]&0x30)>>4;    
                                    // 最大3: 0x30=0011 0000 右移 4位 0000 0011=3 ,原信号在第五位开始有效。
                                    // 并且 该信号占第5和第6 两位长度二进制 11 ,因此就在第五位。 第五位为1: 1 0000  (状态 1开 ,0关)
    
    printf("信号的数值为:%d",eiscdata.lock);
                                    // 读取结构体变量的数值

}




8位原始数据: 0000 0000  对应顺序:7 6 5 4 3 2 1 0;  右移:从右往左数;   左移:从左往右数


  eisca[0]=0x20;   // 内外循环:eiscdata->_fr = (eisca[0]&0x20)>>5;      

     // 最大为1:  0x20=0010 0000 右移 5 位 0000 0001=1  目前在第6位上发送了最大值 1 表示开启: 0010 0000 = 0x20 按键按下是外循环


  eiscf[3]=0x80;     // 洗涤开  :  eiscdata->xidi = (eiscf[3]&0x80)>>7;

      // 最大为1: 0x80=1000 0000 右移 7 位 0000 0001=1  目前在第7位上发送了最大值 1 表示开启: 1000 0000 = 0x80


 eisc87[6]=0x3E;     // 天窗开度 eiscdata->eisctc = (eisc87[6]&0xFE)>>1; 

       // 最大为:0xFE=1111 1110 右移1位 0111 1111=127  目前在第2到7位上发送了 0x3E = 0011 1110 = 62;  62/2=31 结果除以为 31度


  eisca[3]=0x34;     // 蓝牙信号:eiscdata->eisctx = (eisca[3]&0x20)>>5; 

       // 最大1: 0x20=0010 0000 右移5位 0000 0001 目前在第6位发送信号:0010 0000 + 下面设定温度20度组合


  // eiscc_temp // 空调设定温度: eiscdata->eisc_temp = (eisctemp[3]&0x1F); 

// 最大为31: 0x1F=0001 1111=31 占用 1-5 位 ; 设定温度20度=0001 0100  与蓝牙信号 0010 0000 组合(相或)为:0011 0100=0x34



    长度    信号位置

eisctemp 1 4               第4位,占一位




 1  已被阅读了458次  楼主 2023-05-15 19:48:31
回复列表

回复:c 语言字节和位 结构体冒号含义 结构体成员数值的写入与读取

guest
登录之后更精彩~
Powered by HadSky 7.12.10
© 2015-2023 PuYueTian
您的IP:8.219.134.200,2023-10-04 02:27:12,Processed in 0.03168 second(s).
Powered by HadSky
小绿叶技术博客