我在访问嵌套 Struct 中的数据时遇到问题。我正在尝试实现两个 MCU 之间的 SPI 通信。想法是为嵌套在处理程序中并在传输之前序列化的其他函数提供易于操作的 Struct。但是,在序列化期间访问 struct 不起作用。
我试图在下面创建我的数据结构的简化模型。
typedef struct a_t{
uint16_t member1;
uint8_t member2;
} a_t;
typedef struct b_t
{
volatile a_t* aPtr;
volatile uint8_t arrayC[3];
} b_t;
a_t a;
a.member1 = 0xABCD;
a.member2 = 0xEF;
b_t b;
b_t* bPtr = &b;
bPtr->aPtr = &a;
据我了解,struct b 现在包含一个指向 struct 的指针,而 bPtr 指向 struct b。所以如果我取消引用
bPtr->aPtr
我应该得到一个指向 Struct 的指针。如果我进一步取消引用,我应该能够访问这样的成员
bPtr->arrayC[0] = (((bPtr->aPtr->member1) >> 8) & 0xFF);
bPtr->arrayC[1] = ((bPtr->aPtr->member1) & 0xFF);
bPtr>arrayC[2] = bPtr->aPtr->member2;
这应该导致 arrayC 包含以下数据:
bPtr->arrayC[0] == 0xAB;
bPtr->arrayC[1] == 0xCD;
bPtr->arrayC[2] == 0xEF;
可悲的是,我找不到我的代码就是这种情况。在我的情况下,如果我尝试像上面显示的那样分配它们,arrayC 的 Values 如下所示
bPtr->arrayC[0] == 0x00;
bPtr->arrayC[1] == 0x00;
bPtr->arrayC[2] == 0x00;
如果我按以下方式分配 Values
bPtr->arrayC[0] = 0xAB;
Value 按预期更改,因此错误必须在表达式中
(((bPtr->aPtr->member1) >> 8) & 0xFF);
((bPtr->aPtr->member1) & 0xFF);
bPtr->aPtr->member2;
如果这是一个愚蠢的问题,我很抱歉,我可以在其他帖子中找到一些双指针引用。但是我没有找到解释为什么我的解决方案在其他地方不起作用,所以如果有经验的程序员能够向我解释我的错误,我将不胜感激。
编辑:我纠正了模型中的一个错误,其中我错误地将成员 bPtr->aPtr 称为 b->a
Edit2:使用以下编译器测试时,取消引用确实有效
godbolt.org/z/Wdcahndxh
然而,相同的代码在我的 MCU 中产生 0x00(MCU:MKE02Z 处理器:Cortex M0+ 编译器:ARM6 C99)
回答1
我很抱歉。我发现了我的错误。我切换了初始化函数的参数顺序,并错误地将指向 rxBuffer 的指针放入了 SPI 处理程序的 txbufferptr。 rxBuffer 是空的,因此只产生 0。
我感谢所有花时间帮助我的人。我比较新,我应该删除这个问题吗? Stackoverflow 警告我,我可能会被阻止询问我是否这样做。
回答2
先生,
据我了解,struct b 现在包含一个指向 struct 的指针,而 bPtr 指向 struct b。所以如果我取消引用
对不起,这是错误的,你必须从那里重构,你需要使用结构成员来 store 地址,而不是 struct 名称:
// b_t struct has a member named aPtr, by sure you must
// store the address of a here
b.aPtr = &a;