我需要通过 UART 将 float 从 Simulink 发送到 C(嵌入到 MCU 中)。
我已经找到了可用于向相反方向发送 float 的代码,但我需要完全理解它才能编写用于接收 float 的代码。
这是原始代码:
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);
我想我了解正在发生的事情的要点,但有些事情我不确定:
声明了 Float,长度为 4 个字节。
float testFloat = 3.1416;
声明了一个1字节长的指针
unsigned char *chptr;
float 的地址被转换为指针。由于指针和 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 字节 float 标记为:
字节4字节3字节2字节1
在我看来,发送 *chptr++ 的第一个发送行会发送 byte2 而不是 byte1
下一行将发送 byte3,
下一行字节4
最后一行是相邻变量或 byte1 的字节。
但是它在接收端确实可以正常工作(Simulink 设置为以little-endiann 接收),所以我的理解一定是错误的。
感谢您的任何澄清。
PS:一旦我理解了这个方法,它可以用于接收 float 吗?还是我找错了树?
谢谢
最佳答案
正如对您问题的评论所述,您正在使用后增量。因此,您的代码正在访问给定内存位置处的值,执行需要执行的操作,然后将指针移动到下一个内存位置,为下一行代码做好准备。
如果您一直在使用预增量,那么您的陈述“*在我看来,发送 chptr++ 的第一个发送行将发送 byte2 而不是 byte1”是正确的。如果您想对此进行测试,请在 Debug模式下运行代码并将 *chptr++ 更改为 *++chptr。
这个post对递增操作有很好的解释。
关于c - 需要帮助理解指针(在 c 中)以通过 UART 接收 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54702693/