当前位置: 首页 > wzjs >正文

网页设计网站建设怎样注册自己网站的域名

网页设计网站建设,怎样注册自己网站的域名,微信商城小程序多少钱,做网站图片本文衔接上文要求,新增8位bool量的获取方式。 目录 问题提出: Union联合体struct结构体(方式1): Union联合体struct结构体(方式2): BYTE方式读取: 问题提出: 在STM32单片机的编程中,无法定义Boo…

本文衔接上文要求,新增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.dtcms.com/wzjs/3440.html

相关文章:

  • 制作html网站模板互联网推广招聘
  • 常用博客建站程序seo推广工具
  • wordpress 文章无法显示长春做网络优化的公司
  • 网站怎么做百度百科百度竞价网站
  • WordPress弊端东莞seo搜索
  • 产品开发设计哈尔滨seo公司
  • 建立网站后还要钱吗企业邮箱申请
  • 医疗器械注册证查询广东seo
  • 长沙望城建设局网站搜索网站大全排名
  • 网站设计建设seo模拟点击算法
  • 河北网站建设推广公司深圳网络提速优化服务包
  • 网站建设属于那个科目手机如何创建网站
  • 网站建设网站合同版本新东方烹饪培训学校
  • ic电子网站建设互联网运营自学课程
  • 天津企业网站建站市场调研报告最佳范文
  • 娄底360seo优化公司网站优化师
  • 万网如何上传网站网络营销五个主要手段
  • 网页制作与网站建设技术大全 pdf最新行业动态
  • 快速免费做网站网站域名购买
  • o2o和o2b、o2c模式是什么意思啊百度seo搜索排名
  • 找网络公司做网站需要注意seo的形式有哪些
  • 想搭网站做软件首先要学设么浙江网络推广
  • 化妆品网站设计系统需求的策划书外汇交易平台
  • 网站维护推广表徐州百度运营中心
  • 制作化妆品网站百度竞价排名是哪种方式
  • 建设网站需要什么软件下载制作一个app软件需要多少钱
  • 深圳做网站收费百度seo报价
  • 智能写作网站公司网站的推广
  • 甘肃兰州疫情最新情况最新消息河南网站seo费用
  • 网站建设 郑州国内疫情最新情况