需要帮助理解指针(在 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对递增操作有很好的解释。
我需要通过 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对递增操作有很好的解释。