C语言数据结构笔记3:Union联合体+结构体取8位Bool量

本文衔接上文要求,新增8位bool量的获取方式。

目录

问题提出:

Union联合体+struct结构体(方式1):

Union联合体+struct结构体(方式2):

BYTE方式读取:


问题提出:

在STM32单片机的编程中,无法定义Bool或者bit类型

但有时候,比如modbus通信时,需要把bool量八个八个地组合读取,少于8个的部分填充0

Union联合体+struct结构体(方式1):

这里是考虑到超过8位的使用场景,因此定义了超过3字节的定义方式

这种方式适合那种喜欢一个一个列出所有寄存器位名称的情况。


#define BITS_PER_BYTE 8
#define BYTES_FOR_BITS 3  //// 定义3字节的位字段结构
typedef union {uint8_t bytes[BYTES_FOR_BITS];  // 整个字节数组访问struct {// 每个字节单独定义位字段struct {uint8_t b0 : 1;uint8_t b1 : 1;uint8_t b2 : 1;uint8_t b3 : 1;uint8_t b4 : 1;uint8_t b5 : 1;uint8_t b6 : 1;uint8_t b7 : 1;} byte0;struct {uint8_t b0 : 1;uint8_t b1 : 1;uint8_t b2 : 1;uint8_t b3 : 1;uint8_t b4 : 1;uint8_t b5 : 1;uint8_t b6 : 1;uint8_t b7 : 1;} byte1;struct {uint8_t b0 : 1;uint8_t b1 : 1;uint8_t b2 : 1;uint8_t b3 : 1;uint8_t b4 : 1;uint8_t b5 : 1;uint8_t b6 : 1;uint8_t b7 : 1;} byte2;} bits;
} LargeBitField;
#include <stdio.h>typedef unsigned char uint8_t;
typedef unsigned short int    uint16_t;
typedef signed short int      int16_t;#pragma pack(push, 1) //:将结构体的对齐方式设置为 1 字节,并将当前对齐设置保存到堆栈中。//0x03e8 - 0x03ee
typedef struct  ABC_regs1
{uint16_t  A1;uint16_t  B1;int16_t   C1;int16_t   D1;uint16_t  E1;int16_t   F1;int16_t   G1;
}ABC_regs_1;//0x177B - 0x1781
typedef struct  ABC_regs2
{uint16_t  A2;uint16_t  B2;int16_t   C2;int16_t   D2;uint16_t  E2;int16_t   F2;int16_t   G2;
}ABC_regs_2;#define BITS_PER_BYTE 8
#define BYTES_FOR_BITS 3  //// 定义15字节的位字段结构
typedef union {uint8_t bytes[BYTES_FOR_BITS];  // 整个字节数组访问struct {// 每个字节单独定义位字段struct {uint8_t b0 : 1;uint8_t b1 : 1;uint8_t b2 : 1;uint8_t b3 : 1;uint8_t b4 : 1;uint8_t b5 : 1;uint8_t b6 : 1;uint8_t b7 : 1;} byte0;struct {uint8_t b0 : 1;uint8_t b1 : 1;uint8_t b2 : 1;uint8_t b3 : 1;uint8_t b4 : 1;uint8_t b5 : 1;uint8_t b6 : 1;uint8_t b7 : 1;} byte1;struct {uint8_t b0 : 1;uint8_t b1 : 1;uint8_t b2 : 1;uint8_t b3 : 1;uint8_t b4 : 1;uint8_t b5 : 1;uint8_t b6 : 1;uint8_t b7 : 1;} byte2;} bits;
} LargeBitField;typedef struct  Letter_regs
{ABC_regs_1 ABC1;  //0x03e8 - 0x03f1 //7成员 14字节 //偏移量 0x00- 0x0cABC_regs_2 ABC2;  //0x177B - 0x1781 //7成员 14字节 //BOOL_1     Bool1; //LargeBitField Bytes;
}letter_regs;int main(void)
{letter_regs reg;// 设置位reg.Bytes.bits.byte0.b0 = 1;  // 设置byte0的第0位为1reg.Bytes.bits.byte1.b7 = 1;  // 设置byte1的第7位为1// 读取位uint8_t bit0 = reg.Bytes.bits.byte0.b0;uint8_t bit7 = reg.Bytes.bits.byte1.b7;printf("Bit 0 of byte0: %d\n", bit0);printf("Bit 7 of byte1: %d\n", bit7);// 通过字节数组访问reg.Bytes.bytes[0] = 0x0F;  // 设置byte0为0x0Fprintf("Byte 0: 0x%02X\n", reg.Bytes.bytes[0]);}

Union联合体+struct结构体(方式2):

这种方式不一个一个列出寄存器名称,直接通过地址偏移操作:

#include <stdio.h>typedef unsigned char uint8_t;
typedef unsigned short int    uint16_t;
typedef signed short int      int16_t;#pragma pack(push, 1) //:将结构体的对齐方式设置为 1 字节,并将当前对齐设置保存到堆栈中。//0x03e8 - 0x03ee
typedef struct  ABC_regs1
{uint16_t  A1;uint16_t  B1;int16_t   C1;int16_t   D1;uint16_t  E1;int16_t   F1;int16_t   G1;
}ABC_regs_1;//0x177B - 0x1781
typedef struct  ABC_regs2
{uint16_t  A2;uint16_t  B2;int16_t   C2;int16_t   D2;uint16_t  E2;int16_t   F2;int16_t   G2;
}ABC_regs_2;// 定义字节的位字段结构
typedef union {uint8_t byte;  // 整个字节数组访问struct {uint8_t b0 : 1;uint8_t b1 : 1;uint8_t b2 : 1;uint8_t b3 : 1;uint8_t b4 : 1;uint8_t b5 : 1;uint8_t b6 : 1;uint8_t b7 : 1;} bits;
}BitField;typedef struct  Letter_regs
{ABC_regs_1 ABC1;  //0x03e8 - 0x03f1 //7成员 14字节 //偏移量 0x00- 0x0cABC_regs_2 ABC2;  //0x177B - 0x1781 //7成员 14字节 BitField Bytes[10];
}letter_regs;int main(void)
{letter_regs reg;// 通过直接赋值给联合体的字节reg.Bytes[0].byte = 0xA5;  // 0xA5 in hex is 10100101 in binary// 通过位域赋值reg.Bytes[1].bits.b0 = 1;  // Set bit 0 to 1reg.Bytes[1].bits.b7 = 1;  // Set bit 7 to 1// 读取并打印结果printf("Byte 0: 0x%02X\n", reg.Bytes[0].byte);  // 输出 0xA5printf("Byte 1: 0x%02X\n", reg.Bytes[1].byte);  // 输出 0x81 (因为 b7 和 b0 被设置为1)}

BYTE方式读取:

#include <stdio.h>typedef unsigned char uint8_t;
typedef unsigned short int    uint16_t;
typedef signed short int      int16_t;
#pragma pack(push, 1) //:将结构体的对齐方式设置为 1 字节,并将当前对齐设置保存到堆栈中。//0x03e8 - 0x03ee
typedef struct  ABC_regs1
{uint16_t  A1;uint16_t  B1;int16_t   C1;int16_t   D1;uint16_t  E1;int16_t   F1;int16_t   G1;
}ABC_regs_1;//0x177B - 0x1781
typedef struct  ABC_regs2
{uint16_t  A2;uint16_t  B2;int16_t   C2;int16_t   D2;uint16_t  E2;int16_t   F2;int16_t   G2;
}ABC_regs_2;// 定义字节的位字段结构
typedef union {uint8_t byte;  // 整个字节数组访问struct {uint8_t b0 : 1;uint8_t b1 : 1;uint8_t b2 : 1;uint8_t b3 : 1;uint8_t b4 : 1;uint8_t b5 : 1;uint8_t b6 : 1;uint8_t b7 : 1;} bits;
}BitField;typedef struct  Letter_regs
{ABC_regs_1 ABC1;  //0x03e8 - 0x03f1 //7成员 14字节ABC_regs_2 ABC2;  //0x177B - 0x1781 //7成员 14字节 BitField Bytes[10]; //0x0400 - 0x0450 //80 成员 
}letter_regs;int main(void)
{letter_regs reg;// 通过直接赋值给联合体的字节reg.Bytes[0].byte = 0xAA;  // 0xA5 in hex is 10100101 in binaryreg.Bytes[8].byte = 0x6A;  // 0xA5 in hex is 10100101 in binaryunsigned char* ptr = (unsigned char*)&reg.Bytes;//print_struct_values(&reg);//联合体读8个,实际物理地址才偏移1,相对于基地址地偏移量,都一个BYTE才偏移1for (int j = 0; j < 10; j++) //读10个BYTE 整个联合体{unsigned char offset = j; // 计算偏移量uint8_t value = *(const uint8_t*)(ptr + offset);printf("Byte %d: 0x%02X\n",j,value);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/82794.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三种读写传统xls格式文件开源库libxls、xlslib、BasicExcel的比较

最近准备读写传统xls格式文件&#xff0c;而不是较新的xlsx&#xff0c;询问DeepSeek有哪些开源库&#xff0c;他给出了如下的简介和建议&#xff0c;还给出了相应链接&#xff0c;不过有的链接已失效。最后还不忘提醒&#xff0c;现在该用xlsx格式了。 以下是几个可以处理传统…

从测试角度看待CI/CD,敏捷开发

什么是敏捷开发&#xff1f; 是在高强度反馈的情况下&#xff0c;短周期&#xff0c;不断的迭代产品&#xff0c;满足用户需求&#xff0c;抢占更多的市场 敏捷开发是什么&#xff1f; 是一种产品快速迭代的情况下&#xff0c;降低出错的概率&#xff0c;具体会落实到公司的…

figma MCP + cursor如何将设计稿生成前端页面

一、准备工作 figma MCP需要通过figma key来获取设计稿权限&#xff0c;key的生成步骤如下 1. 打开figma网页版/APP&#xff0c;进入账户设定 2. 点击生成token 3. 填写内容生成token(一定要确认复制了&#xff0c;不然关闭弹窗后就不会显示了) 二、配置MCP 4. 进入到cursor…

git互联GitHub 使用教程

一、下载git Git 公司 右键 git config --global user.name "name" git config --global user.email "email" ssh-keygen -t rsa -C email &#xff1a;生成的ssh密钥需要到github 网站中保存ssh 二、GitHub新建repository 三、本地git互联GitHub 找…

“轻量应用服务器” vs. “云服务器CVM”:小白入门腾讯云,哪款“云机”更适合你?(场景、配置、价格对比解析)

更多云服务器知识&#xff0c;尽在hostol.com 当你第一次踏入腾讯云这个“数字百货大楼”&#xff0c;面对琳琅满目的“云产品”&#xff0c;是不是有点眼花缭乱&#xff0c;特别是看到“轻量应用服务器”和“云服务器CVM”这两位都号称能帮你“安家落户”的“云主机”时&…

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…

Qt学习及使用_第1部分_认识Qt---Qt简介

前言 学以致用,通过QT框架的学习,一边实践,一边探索编程的方方面面. 参考书:<Qt 6 C开发指南>(以下称"本书") 标识说明:概念用粗体倾斜.重点内容用(加粗黑体)---重点内容(红字)---重点内容(加粗红字), 本书原话内容用深蓝色标识,比较重要的内容用加粗倾斜下划线…

Python语法基础篇(包含类型转换、拷贝、可变对象/不可变对象,函数,拆包,异常,模块,闭包,装饰器)

Python语法基础篇&#xff08;二&#xff09; 类型转换拷贝可变对象与不可变对象可变对象不可变对象 函数拆包异常模块闭包装饰器 &#x1f439;&#x1f439;&#x1f439;&#x1f439;&#x1f439;一只正在努力学习计算机技术的小仓鼠&#xff0c;尾部有课程链接哦~&#x…

录制mp4

目录 单线程保存mp4 多线程保存mp4 rtsp ffmpeg录制mp4 单线程保存mp4 import cv2 import imageiocv2.namedWindow(photo, 0) # 0窗口大小可以任意拖动&#xff0c;1自适应 cv2.resizeWindow(photo, 1280, 720) url "rtsp://admin:aa123456192.168.1.64/h264/ch1/main…

ISBN书号查询接口如何用PHP实现调用?

一、什么是ISBN书号查询接口 ISBN数据查询接口是一项图书信息查询服务。它基于全球通用的ISBN编码系统&#xff0c;帮助用户快速获取图书的详细信息&#xff0c;包括书名、作者、出版社、出版时间、价格、封面等关键字段。 该接口广泛应用于电商平台、图书馆管理系统、二手书…

Redis底层数据结构之深入理解跳表(2)

上一篇文章中我们详细讲述了跳表的增添、查找和修改的操作&#xff0c;这篇文章我们来讲解一下跳表在多线程并发时的安全问题。在Redis中&#xff0c;除了网络IO部分和大文件的后台复制涉及到多线程外&#xff0c;其余任务执行时全部都是单线程&#xff0c;这也就意味着在Redis…

Go语言依赖管理与版本控制-《Go语言实战指南》

在现代软件开发中&#xff0c;项目的第三方依赖和版本控制扮演着至关重要的角色。Go 语言自 Go 1.11 引入 Modules&#xff08;模块化管理&#xff09;以来&#xff0c;已经实现了内建的依赖管理机制&#xff0c;彻底摆脱了传统 GOPATH 模式的限制。 本章将深入探讨如何使用 Go…

Appium+python自动化(十一)- 元素定位- 下

1、 List定位 List顾名思义就是一个列表&#xff0c;在python里面也有list这一个说法&#xff0c;如果你不是很理解什么是list&#xff0c;这里暂且理解为一个数组或者说一个集合。首先一个list是一个集合&#xff0c;那么他的个数也就成了不确定性&#xff0c;所以这里需要用复…

stress 服务器压力测试的工具学习

一、stress 工具介绍 tress 是一种工具&#xff0c;可以对符合 POSIX 标准的操作系统施加可配置数量的 CPU、内存、I/O 或磁盘压力&#xff0c;并报告其检测到的任何错误。 stress 不是一个基准测试。它是由系统管理员用来评估其系统扩展性的工具&#xff0c;由内核程序员用来…

不止抓请求:5种开发场景中的抓包组合策略(含 Charles 等工具)

很多开发者用抓包&#xff0c;只在“接口调不通”的时候。 但在复杂项目中&#xff0c;抓包早已不仅是调错工具&#xff0c;更是开发节奏提速器、协作问题解耦器、架构瓶颈探测器。 关键在于——不同场景下&#xff0c;你要用对方法、配对工具。 以下是我根据日常开发实战&a…

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…

计算机系统大作业——程序人生

计算机系统 大作业 题 目 程序人生-Hello’s P2P 专 业 物联网工程 学   号 2022112820 班 级 2237301 学 生 孟宇航 指 导 教 师 吴 锐 计算机科学与技术学院 2024年…

〈软件安装管家软件目录〉▷Windows系统版

①装机常用 ☞压缩解压WinRAR7-ZIPBandZip360压缩☞文件工具EverythingOneCommander XYplorer ReNamer ☞卸载软件CCleanerIObitUninstallerUninstall toolGeekAutodesk卸载Adobe卸载Ashampoo☞驱动软件驱动人生&#xff08;离线版&#xff09;驱动精灵&#xff08;离线版&…

CentOS Stream 8 Unit network.service not found

一、问题现象 在 CentOS Stream 8 操作系统中&#xff0c;配置完静态IP 信息&#xff0c;想重启网络服务。 执行如下命令&#xff1a; systemctl restart network 提示信息如下&#xff1a; Failed to restart network.service: Unit network.service not found. 二、问题…

极空间z4pro配置gitea mysql,内网穿透

极空间z4pro配置gitea mysql等记录&#xff0c;内网穿透 1、mysql、gitea镜像下载&#xff0c;极空间不成功&#xff0c;先用自己电脑科学后下载镜像,拉取代码&#xff1a; docker pull --platform linux/amd64 gitea/gitea:1.23 docker pull --platform linux/amd64 mysql:5.…