结构体-联合体使用加强版

先看代码

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、总结

//总结位位相对!!!!按顺序先确定占那个位置,然后在那个位置,以下面的数据在前面。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rose_yj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值