需要帮助理解指针(在 c 中)以接收 UART 上的浮点数

Need help understanding pointers (in c) to receive a float over UART

我需要通过 UART 将浮点数从 Simulink 发送到 C(嵌入在 MCU 中)。

我找到了用于在相反方向发送浮点数的代码,但我需要完全理解它才能编写用于接收浮点数的代码。

这是原代码:

 unsigned char *chptr;
 chptr = (unsigned char *) &floatvalue;
 Tx(*chptr++);Tx(*chptr++);Tx(*chptr++);Tx(*chptr);

这是我修改后的代码(有效):

float testFloat = 3.1416;
unsigned char *chptr;                           
chptr = (unsigned char *) &testFloat;           
ROM_UARTCharPut(UART0_BASE,*chptr++);           
ROM_UARTCharPut(UART0_BASE,*chptr++);
ROM_UARTCharPut(UART0_BASE,*chptr++);
ROM_UARTCharPut(UART0_BASE,*chptr);

我想我明白了事情的要点,但有些事情我不确定:

声明了 4 个字节长的浮点数。

float testFloat = 3.1416;

声明了一个 1 字节长的指针

unsigned char *chptr;    

浮点数的地址被转换成指针。由于指针和 char 的位长度不同,我假设只有 float 的位 0 到 7 的地址被转换为指针(小端)

chptr = (unsigned char *) &testFloat;    

接下来的四行是我的理解崩溃的地方。

ROM_UARTCharPut(UART0_BASE,*chptr++);           
ROM_UARTCharPut(UART0_BASE,*chptr++);
ROM_UARTCharPut(UART0_BASE,*chptr++);
ROM_UARTCharPut(UART0_BASE,*chptr);

我知道“*chptr”是指针指向的变量的值。我还了解到“*chptr++”将指针的地址递增到下一个字节。但是这个顺序对我来说没有意义。

如果我要将 4 字节浮点数标记为:

byte4 byte3 byte2 byte1

在我看来,发送 *chptr++ 的第一条发送线会发送 byte2 而不是 byte1

下一行将发送byte3,

下一行byte4

最后一行是相邻变量的字节或 byte1。

然而它在接收端确实工作正常(Simulink 设置为小端接收)所以我的理解一定是错误的。

感谢您的澄清。

PS: 了解了这个方法后,是否可以接收浮点数?还是我找错树了?

谢谢

正如对您问题的评论所述,您使用的是 post-increment。所以你的代码正在访问给定内存位置的值,做它需要做的事情,然后将指针移动到下一个内存位置,为下一行代码做好准备。

如果你一直在使用预递增,那么你就是在声明“*在我看来,发送 chptr++ 的第一条发送行会发送字节 2 而不是字节 1”是真实的。如果你想对此进行测试,运行 调试模式下的代码并将 *chptr++ 更改为 *++chptr。

这个post对递增操作有很好的解释。