我需要在某些Texas Instrument CC2530节点之间发送一些浮点数。 这种架构只能发送一个uint8阵列 我已经尝试做的是为一个uint8指针指定一个带有强制转换的浮点指针。 然后我发送这些字节,当收到它们时,它们被复制到uint8数组中。 最后,我创建了另一个浮点指针,用于设置先前创建的数组的强制转换 实际上,这个技巧在我的电脑上工作(使用unsigned char而不是uint8),但不在节点中,接收到的数字总是为0。
这是传输事件中使用的代码的一部分(它创建了msa_Data1
,即传输的数据包,其中要发送的数字是valMed
(全局变量)):
void Data_create(){
uint8 *sends;
sends = (uint8 *) &valMed;
uint8 rec_index;
for(rec_index=0; rec_index < sizeof(float); ++rec_index){
msa_Data1[rec_index]= sends[rec_index];
}
}
在接待部分,我有:
uint8 receiveds[sizeof(float)];
uint8 rec_index;
for(rec_index=0; rec_index < sizeof(float); ++rec_index){
receiveds[rec_index]= pData->dataInd.msdu.p[rec_index];
}
float *received= (float *)receiveds;
来自传输的数据由pData->dataInd.msdu.p[rec_index]
我在电脑上尝试的传输模拟是:
main(){
float send= -3.14;
unsigned char *sends;
sends = (unsigned char *)&send;
printf("1:%d, 2:%d, 3:%d, 4:%d \nfloat sent:%f \n", sends[0], sends[1], sends[2], sends[3], send);
unsigned char receiveds[sizeof(float)];
int rec_index;
for(rec_index=0; rec_index < sizeof(float); ++rec_index){
receiveds[rec_index]= sends[rec_index];
}
float *received= (float *)receiveds;
printf("float received:%f\n", *received);
}
输出:
alex@aspire7738G ~/test $ ./test
1:195, 2:245, 3:72, 4:192
float sent:-3.140000
float received:-3.140000
在这种情况下,我可以看到测试在PC上运行良好,但它不在节点上。 怎么了?
提前感谢您的帮助!
亚历
答案 0 :(得分:2)
接收部分的代码存在问题。您将字节复制到receiveds
,然后使用指针转换将其视为float
。但是,许多C实现对字符/字节类型使用单字节对齐(可能为receiveds
)和float
类型的四字节对齐。将uint8
指针转换为float
指针可能会导致指针调整不正确。
相反,你可以这样做:
float received;
… // Code that prepares receiveds goes here.
memcpy(&received, receiveds, sizeof received);
此外,如果pData->dataInd.msdu.p
是一个数组或指向字节的指针(char
,unsigned char
,或者,uint8
和uint8
可能是您的C实现中的字符类型),然后您可以省略使用receiveds
作为中间缓冲区并直接复制:
float received;
// Omit the code that copied into receiveds.
memcpy(&received, pData->dataInd.msdu.p, sizeof received);
如果这不能解决问题,那么检查复制到发送缓冲区的实际字节以及从接收缓冲区复制的字节,并确保它们是相同的。
答案 1 :(得分:1)
为什么不使用定点来表示您的数字?每当我使用TI CC2530时,我都试图避免浮点数的开销,并使用定点表示数字。发送它们时,这些值更直接,但你必须小心你的表示。