我需要通过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:一旦我了解了此方法,该方法是否可以用于接收浮点数?还是我吠错了树?
谢谢
答案 0 :(得分:0)
作为对问题状态的评论,您使用的是后递增。因此,您的代码正在访问给定存储位置处的值,执行它所需的操作,然后将指针移至下一个存储位置,为下一行代码做好准备。
如果您一直在使用pre-increment,那么您会说“ *在我看来,发送 chptr ++的第一个发送行将发送byte2而不是byte1 ”是正确的。如果要对此进行测试,请在调试模式下运行代码,并将* chptr ++更改为* ++ chptr。
此post很好地说明了递增操作。