需要帮助来理解指针(在C中)以通过UART接收浮点数

时间:2019-02-15 04:27:40

标签: c pointers 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

下一行将发送字节3

下一行byte4

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

但是,它在接收端正常工作(Simulink设置为在little-endiann中接收),因此我的理解一定是错误的。

谢谢您的澄清。

PS:一旦我了解了此方法,该方法是否可以用于接收浮点数?还是我吠错了树?

谢谢

1 个答案:

答案 0 :(得分:0)

作为对问题状态的评论,您使用的是后递增。因此,您的代码正在访问给定存储位置处的值,执行它所需的操作,然后将指针移至下一个存储位置,为下一行代码做好准备。

如果您一直在使用pre-increment,那么您会说“ *在我看来,发送 chptr ++的第一个发送行将发送byte2而不是byte1 ”是正确的。如果要对此进行测试,请在调试模式下运行代码,并将* chptr ++更改为* ++ chptr。

post很好地说明了递增操作。