类型: 16 位编译器 32位 64位
char 1个字节 1 个字节 1 个字节
char * 2个字节 4 个字节 8 个字节
short int 2个字节 2 个字节 2 个字节
int 2个字节 4 个字节 4 个字节
int * 2个字节(指针都是一样的) 4 个字节 8 个字节
unsigned int 2个字节 4 个字节 4 个字节
float 4个字节 4 个字节 4 个字节
double 8个字节 8 个字节 8 个字节
long 4个字节 4 个字节 8 个字节
long long 8个字节 8 个字节 8 个字节
unsigned long 4个字节 4 个字节 8 个字节
信号由: 名称 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位无效,可以换成 uint16_t 等
(由 10转2进制得来长度 如 7 转2 为 111 占3位)
data->name = (can2A5[2]&0x07); // 0x07 表示 该name 信号的数值 是 2A5 的 第2字节的 0x07= 0111 第 0到3位有效, 发送的数值也要在 0到3位,其它位置无效。
// 由于是向与,因此 最终结果是输入的数值
data->passwd = (can666[4]&0x30)>>4;
// 0x30 = 00 11 00 00 表示约定该信号是 第4字节的 第5和4位为有效 最大为 11 有四种状态 00 01 10 11 即 0 1 2 3
// 因此发送的信息也要在 第5 和第4位上发送,发送的数值与 0x30 相与(等于将最终结果值交给输入的值,输入1 为1 ,输入0 为0 ) 最后再整体右移4位,数值缩小得到 0 1 2 3 单数目标状态
// 案例 00 xx 00 00 其中 xx 改为 01 表示 最终为1 , 但是发送信息要发送: 00 01 00 00 = 0x20 即: 16进制的 20 即 BUSMASTER 第 4 字节发送 20
data->name = (can2A5[3]&20)>>5 // 此处不是进行与计算,而 20 换算成二进制 0001 0100 占用5位二进制有效 向右移动五位,也就是去掉右边的5位,等于 第6位的结果,就是它的值
起始字节(Start Byte) = 3 ; 起始位(Start Bit) =7 ; 长度(len) =3 =111 = 7 (长度为3 最大为7);
占位:从左第7位开始往右数到0为止 ; 此处表示:从第3字节的第7位开始右数3位),最大 111, 最小000 表示: 最大:1110 0000 表示1为 0010 0000
数值:从右往左读取后计算 长度3= 111 = 7
数据类型 占用空间 表示范围 说明
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位,占一位Powered by ddoss.cn 12.0
©2015 - 2025 ddoss
渝公网安备50011302222260号
渝ICP备2024035333号
【实验平台安全承诺书】
小绿叶技术社区,优化网络中,点击查看配置信息
主机监控系统: 安全防火墙已开启检查cc攻击-下载文件完成后等待10s 恢复访问,检查连接数低于峰值恢复访问
您的IP:216.73.216.110,2025-12-01 15:25:03,Processed in 0.013 second(s).