结构的数据到联合

Data of a struct into a union

我已经宣布下一个联盟:

typedef union
{
   struct
   {
      uint32_t data;
   };
uint8_t w[4];
} xxx_data_t

我正在尝试通过SPI 访问内存,它只有1Byte 的输入容量。 我想输入变量 data,我已经将 32 位 data 变量分解为 4 个 8 位变量(每个 1Byte),从而形成 w[4] 数组。 我的问题是:这有效吗?这会分解我的 32 位变量?

示例

我声明xxx_DATA_t my_variablemy_variable.data=300 十六进制为 0x12C。数组会是 my_variable.w[4]=[0,0,1,44]??

数据(32 位)= 300 = 0x 00 00 01 2C

w(4 位)====== = 0x [0] [0] [1] [44]

谢谢大家

我觉得是对的。你可以写一个测试程序来测试一下。

#include<stdio.h>
#include<stdint.h>
typedef union
{
   struct
   {
      uint32_t data;
   };
uint8_t w[4];
}data_t;

int main(){
        data_t d = {.data = 0x12c};
        for(int i = 0; i < 4; i++){
                printf("%d\n", d.w[i]);
        }

        return 0;
}
44
1
0
0

My question is: is this valid?

是的,您可以使用联合在不同类型之间进行类型双关。输入双关 to/from 字符类型(uint8_t 几乎肯定是)总是安全的。 Alignment/padding 在这种特定情况下也不应该成为问题。

请注意,您只能在 C 中执行此操作 - 您 不能 在 C++ 中执行此操作。所以在使用C++进行硬件相关编程之前要三思。

which in hexadecimal is 0x12C. Will the array be my_variable.w[4]=[0,0,1,44]??

这取决于 CPU 字节顺序。 What is CPU endianness?

因此您可以在 Power PC 等 Big Endian 计算机上获取 00 00 01 2C,或者在 x86 等 Little Endian 计算机上获取 2C 01 00 00

至于您实际上想要 的字节序,它是网络 字节序。在 SPI 的情况下,网络字节顺序与您与之通信的部分所期望的字节顺序相同。您必须在数据表中查找它,以防它是一个“哑”部件,如 ADC、显示器或类似部件。如果它是像另一个 MCU 一样的“智能”部分,那么您可以自己指定网络字节顺序。