先看代码
1.test1.h文件
#ifndef _TEST1_H
#define _TEST1_H
typedef signed char i8;
typedef unsigned char u8;
typedef signed short i16;
typedef unsigned short u16;
typedef signed int i32;
typedef unsigned int u32;
typedef signed long long i64;
typedef unsigned long long u64;
typedef struct sCanFrame
{
union {
u32 id;
// 按地址
struct
{
u32 addr : 8; // 设备地址
u32 board : 8; // 板号
u32 mach : 8; // 机号
u32 type : 5;
u32 frame_error : 1; // @see canid_t bit29
u32 frame_remote : 1; // @see canid_t bit30
u32 frame_format : 1; // @see canid_t bit31(0-标准帧,1-扩展帧)
};
// 读写配置或状态
struct
{
u32 fid_reserved : 7;
u32 is_rsp : 1; // 请求或响应
};
};
u8 len;
u8 __pad;
u8 __res0;
u8 __res1;
union {
u32 d32[2];
u16 d16[4];
u8 d8[8];
// 命令
struct
{
u8 cmd;
};
// 事件
struct
{
u8 event;
};
// 读写配置/状态
struct
{
u8 from_mach;
u8 from_board;
u8 data_addr;
u8 data_id;
union {
u32 data;
// 读登记信息请求
struct RegInfoReq
{
u8 start;
u8 num;
} reg_req;
// 回路登记信息
struct RegInfo
{
u8 addr;
u8 type;
u8 mgmt;
} reg_info;
// 批量登记回路信息
struct BatchRegInfo
{
u8 type_id;
u8 start;
u8 num;
u8 interval;
} batch_reg_info;
// 通用回复
struct CommonResponse
{
u8 err_code;
} common_rsp;
// 通道登记信息-直控板
struct DCtrlRegInfo
{
// 启用设置
u8 enable;
// 屏蔽设置
u8 block;
} dctrl_reg_info;
// 通道登记信息
struct DBusKeyRegInfo
{
// 绑定机号
u8 mach;
// 绑定板号
u8 board;
// 启动地址
u8 start;
// 反馈地址
u8 feedback;
} bus_key_reg_info;
// 通道批量登记信息
struct DBusKeyBatchRegInfo
{
// 通道数量
u8 num;
// 绑定板号
u8 board;
// 起始启动地址
u8 start;
// 起始反馈地址
u8 feedback;
} bus_key_batch_reg_info;
// 通道批量登记机号
struct BusKeyBatchRegMachine
{
// 通道数量
u8 num;
// 绑定机号
u8 mach;
} bus_key_batch_reg_mach;
};
};
}alignas(8);
} CanFrame;
extern CanFrame f;
#endif
2.c文件
#include <stdio.h>
#include <string.h>
#include "test1.h"
CanFrame f;
int main()
{
//总结**位位相对!!!!按顺序先确定占那个位置,然后在以下面的在前面。**
#if 1
//d32[1]
f.bus_key_reg_info.mach = 0x08; //d8[4]
f.bus_key_reg_info.board = 0x07; //d8[5]
f.bus_key_reg_info.start = 0x06; //d8[6]
f.bus_key_reg_info.feedback = 0x05; //d8[7]
/*f.event = 0x05;
f.cmd = 0x06;*/
//d32[0]
//d16[0]
f.from_mach = 0x04; //d8[0]
f.from_board = 0x03; //d8[1]
//d16[1]
f.data_addr = 0x02; //d8[2]
f.data_id = 0x01; //d8[3]
printf("data=%08x\n",f.data);
//printf("from_mach=%x,from_board=%x,data_addr=%x,data_id=%x\n", f.from_mach, f.from_board, f.data_addr, f.data_id);
//printf("from_mach=%x\n", f.data_id);
printf("d32[0]=%08x,d32[1]=%08x\n", f.d32[0], f.d32[1]);
printf("d16[0]=%04x,d16[1]=%04x\n", f.d16[0], f.d16[1]);
printf("d16[2]=%04x,d16[3]=%04x\n", f.d16[2], f.d16[3]);
for (int i = 0; i < 8; i++)
{
printf("d8[%d]=%02x ", i, f.d8[i]);
}
printf("\n");
printf("f.event=%02x\n", f.event);
printf("f.cmd=%02x\n", f.cmd);
printf("len=%02x,__pad=%02x\n,__res0=%02x,__res1=%02x\n", f.len, f.__pad,f.__res0,f.__res1);
#endif
#if 0
//反过来测试
f.d32[0] = 0x04030201;
f.d32[1] = 0x08070605;
printf("mach=%02x,board=%02x,start=%02x,feedback=%02x\n", f.bus_key_reg_info.mach, f.bus_key_reg_info.board,
f.bus_key_reg_info.start, f.bus_key_reg_info.feedback);
printf("from_mach=%02x,from_board=%02x,data_addr=%02x,data_id=%02x\n", f.from_mach, f.from_board, f.data_addr, f.data_id);
printf("d16[0]=%04x,d16[1]=%04x\n", f.d16[0], f.d16[1]);
printf("d16[2]=%04x,d16[3]=%04x\n", f.d16[2], f.d16[3]);
for (int i = 0; i < 8; i++)
{
printf("d8[%d]=%02x ", i, f.d8[i]);
}
printf("\n");
printf("f.event=%02x\n", f.event);
printf("f.cmd=%02x\n", f.cmd);
printf("data=%08x\n", f.data);
printf("\n");
#endif
return 0;
}
3、总结
//总结位位相对!!!!按顺序先确定占那个位置,然后在那个位置,以下面的数据在前面。