搜索
bottom↓
回复: 13
打印 上一主题 下一主题

51单片机C语言联合体如何使用

[复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2022-4-26 11:47:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


u8 apple_buff[0x10];
u32 apple1,apple2,apple3,apple4;


for(i=0;i<0x10;i++)apple_buff[i]=0;  // 字节操作  16个字节清0  ,4个32位也清0了。想达到这个目的

如何 把8位数组  跟  4个32位数据  关联。


出0入8汤圆

2
发表于 2022-4-26 12:32:27 | 只看该作者
struct dd
{
u32;
u32;
u32;
u32;
};
union cc
{
struct dd;
u8 apple_buff[0x10];
};

出0入217汤圆

3
发表于 2022-4-26 14:08:05 | 只看该作者
union APPLE
{
    u8 apple_buff[0x10];
    u32 apple[4];
};
这样就好了,没必要用结构了。

出0入0汤圆

4
 楼主| 发表于 2022-4-26 23:00:57 | 只看该作者
ehengio 发表于 2022-4-26 14:08
union APPLE
{
    u8 apple_buff[0x10];
(引用自3楼)

u8 apple_buff[0x10];                // 8位数组
; -----------------------------------
u32 apple1;                                // 32位的 16位的 浮点的变量   
u16 apple2;
u16 apple3,
float apple4;
float apple6;
实际 情况需要将这些数据 联合

出0入0汤圆

5
 楼主| 发表于 2022-4-26 23:15:36 | 只看该作者
#include "reg52.h"

#define u8         unsigned char
#define u16 unsigned int
#define u32 unsigned long


struct VoltStruct
{
        u32 volt1;
        u32 volt2;
        u32 volt3;
        u32 volt4;
};
union cc
{
        struct VoltStruct voltAll;
        u8 volt_buff[0x10];
};
/*

*/
void main()
{
        volt1=0x11223344;
        volt2=0x55667788;
        volt3=0x99AABBCC;
        volt2=0xDDEEFF00;
       
        volt_buff[0x00]=0;
        volt_buff[0x01]=0;
        while(1)
        {
               
        }
}
写了一个测试程序  编译不过

出0入0汤圆

6
 楼主| 发表于 2022-4-26 23:26:14 | 只看该作者
#include "reg52.h"

#define u8         unsigned char
#define u16 unsigned int
#define u32 unsigned long


struct VoltStruct
{
        u32 volt1;
        u32 volt2;
        u32 volt3;
        u32 volt4;
};

struct VoltStruct voltAll;
u8 volt_buff[0x10];
union cc
{
        struct VoltStruct voltAll;
        u8 volt_buff[0x10];
};
/*

*/
void main()
{
        voltAll.volt1=0x11223344;
        voltAll.volt2=0x55667788;
        voltAll.volt3=0x99AABBCC;
        voltAll.volt4=0xDDEEFF00;
       
        volt_buff[0x00]=0;
        volt_buff[0x01]=0;   // 通过字节的方式 清0,仿真发现没有清0  没有联合成功  ,哪里原因呢
        volt_buff[0x02]=0;
        volt_buff[0x03]=0;
        while(1)
        {
               
        }
}

出200入2554汤圆

7
发表于 2022-4-27 00:32:16 | 只看该作者
LZ 怎么这么热衷于用 U8 数组来清零呢?指针不香么?例如这样:

  1. struct _DATPACK
  2. {
  3.   uint32_t  dw1;
  4.   uint32_t  dw2;
  5.   float  fa;
  6.   float  fb;
  7. } dat;

  8. memset( &dat, 0x00, sizeof(dat) );        // 清零 dat 所有元素

  9. uint8_t *ptr= (uint8_t *)&dat;
  10. ptr[0]= 0x12;            // 按字节访问
  11. ptr[1]= 0x56;            // 按字节访问
  12. ptr[2]= 0x00;            // 按字节访问
复制代码



定义的话,也得是把数组和元素定义在一个 union 里,并且注意各元素需要再打包成一个 struct 避免重叠。形如:

  1. union _DATPACK
  2. {
  3.   struct _ELEM
  4.   {
  5.     //...
  6.   };

  7.   uint8_t  Array[1];    // 柔性数组
  8. };
复制代码

出5入8汤圆

8
发表于 2022-4-27 08:19:57 | 只看该作者
本帖最后由 diyeyuye 于 2022-4-27 08:21 编辑
woshigeshuai 发表于 2022-4-26 23:26
#include "reg52.h"

#define u8         unsigned char
(引用自6楼)


你没有用你定义的联合体类型声明一个变量,然后操作其变量才能改变联合体内成员的值。
例如:

  1. struct VoltStruct
  2. {
  3.         u32 volt1;
  4.         u32 volt2;
  5.         u32 volt3;
  6.         u32 volt4;
  7. };
  8. union cc
  9. {
  10.         struct VoltStruct voltAll;
  11.         u8 volt_buff[16];
  12. };

  13. union cc testVar;//使用联合体声明一个变量
  14. /*

  15. */
  16. void main()
  17. {      
  18.         testVar.voltAll.volt1=0x12345678;
  19.         testVar.voltAll.volt2=0x22345678;
  20.         testVar.voltAll.volt3=0x32345678;
  21.         testVar.voltAll.volt4=0x42345678;
  22.       
  23.         testVar.volt_buff[0x00]=0;
  24.         testVar.volt_buff[0x01]=0;  
  25.         testVar.volt_buff[0x02]=0;
  26.         testVar.volt_buff[0x03]=0;//上述清零会清除testVar.voltAll.volt1的值
  27.         while(1)
  28.         {
  29.                
  30.         }
  31. }
复制代码

出0入0汤圆

9
 楼主| 发表于 2022-4-27 10:12:50 | 只看该作者
非常感谢大家的帮助,问题解决了。我现在是一个人干活状态,没有人交流。有问题只能咨询论坛。

出0入4汤圆

10
发表于 2022-4-27 10:17:08 | 只看该作者
woshigeshuai 发表于 2022-4-27 10:12
非常感谢大家的帮助,问题解决了。我现在是一个人干活状态,没有人交流。有问题只能咨询论坛。 ...
(引用自9楼)

我现在也是一个人干活,有空多交流

出0入0汤圆

11
发表于 2023-7-27 15:12:38 | 只看该作者
我们也是 一个人的干活  自己画板子, 自己写简单的程序

出0入8汤圆

12
发表于 2023-7-27 16:10:27 | 只看该作者
我也是一个人干活,画板子,写程序,有空多交流

出1310入193汤圆

13
发表于 2023-7-27 22:19:43 来自手机 | 只看该作者
ls四位可以组团啦

出0入0汤圆

14
发表于 2023-8-22 09:54:20 | 只看该作者
组团的话,可以加我一个。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 17:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表