c - 需要帮助理解指针(在 c 中)以通过 UART 接收 float

标签 c pointers uart

我需要通过 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/

相关文章:

c++ - VS : How to configure DebugWithReleaseCRT?

c - 无法理解这个指向 arraycode 的 C 指针的输出

c++ - 我的构造函数主体中的简单指针语法问题

c - MavLink UART 消息解码(PX4Flow 模块)

c - 如何使用嵌入式 C 代码通过 UART 发送转义序列

c - 读取 csv 文件并存储在缓冲区中时出现问题

c - n 个数字的可能组合

c - fscanf 从文本文件到结构指针

c - 处理存储在指向 C 中多个字符串的指针数组中的单个字符串的问题

python - Pyserial 不能像 linux shell 那样写入 tty