上下位机浮点数的传输方法

上下位机浮点数的传输方法,第1张

       嵌入式产品开发经常会用到串口等接口进行上位机和下位机之间的数据传输,那上位机和下位机是如何通过串口进行浮点数传输的呢?我们知道串口有ASCII码(即可见字符形式)和二进制数据格式两种传输方式,是以字节为单位进行数据传输的,这就需要先将浮点数(四个字节)转换为一个一个的字节数再利用串口传输。现将其转换方法总结如下: 

    1、联合体的方式实现

    union { uint8_t a[4]float b} c

    其中a[0]是b的最高字节。只需将待传输的浮点数直接赋值为b,利用串口传输时利用a[4]数组进行传输即可。

    2、扩大移位的方式实现

    比如需要通过串口将80.35这个浮点数进行传输,首先先将其扩大1000倍(其目的是为了保留数据的准确性)后赋值给a,a = 80350(其十六进制为0X0139DE)。然后:(a>>24)&(0X0011) = 00(最高位字节);(a>>16)&(0X0011) = 01(次高位字节);(a>>8)&(0X0011) = 39;a&(0X0011) = DE(最低位字节);最后将其值分别赋值给一个数组,利用串口传输出去。

    3、整数求余的方式实现

    比如a = 54321,a%10 = 1;a/10%10 = 2;a/100%10 = 3a/1000%10 = 4a/10000 = 5然后将其值赋值给一个数组,利用串口发送出去。

    4、指针的方式实现

    float a,unsigned char *b;a = 803.50;char *pchar = (char*)&a;for(i = 0i <sizeof(float)i++){*b = *pcharpchar++b++},然后只需通过串口将b指针指向的内容传输出去即可。

    以上四种方法建议使用联合体和指针的方法,因为其他两种方法牵涉到浮点数小数点后保留几位小数的问题,这和放大倍数有关,数据接收方还需要进行数据重新组合和处理比较麻烦。

你要发送原始数据流 还是 格式化输出?

如果是格式化 按原子说的 ,用sprintf / printf

如果发送原始内存数据流, 可按下面发送,

发送

float a = 1.23double b=3.2

SendBytes( *(u8*)&a ,sizeof(a) )

SendBytes( *(u8*)&b ,sizeof(b) )

上位机接到的 十六进制码,再按同样格式转回来。

如 分别接收到 s1[4] s2[8] 里面, 如果是float 就是4个字节

*(float*)&s1 就是 a

*(double*)&s2 就是b

如果解决了您的问题请采纳!

如果未解决请继续追问

那龟孙子胡说,不用听。

//Flags

_fstrcpy((char *)buf,"SZFSET")

//Address

buf[6+0] = *(((BYTE *)&wAddress)+1)

buf[6+1] = *(((BYTE *)&wAddress)+0)

//Switch

if(bSwitch)

{

buf[6+2] = 0xAA

}

else

{

buf[6+2] = 0x0

}

//Freq

buf[6+3] = *(((BYTE *)&wFormatFreq)+1)

buf[6+4] = *(((BYTE *)&wFormatFreq)+0)

//Vol

buf[6+5] = *(((BYTE *)&nVoltage)+1)

buf[6+6] = *(((BYTE *)&nVoltage)+0)

//RiseTime

buf[6+7] = *(((BYTE *)&nRiseTime)+1)

buf[6+8] = *(((BYTE *)&nRiseTime)+0)

======》上面这些是将要发送的内容组成发送用的数组。

bSuccess = TRUE

for(int j=0j<16j++)

{

mLogMotorNet.SendData(buf[j]) =======》这是上位机循环发送数组

}

下面的是收到单片机上传的处理

BYTE byCh = mLogMotorNet.ReceiveData()

if(j==2 &&byCh!=0xAA ||j==3 &&byCh!=0x55 ||

j==0 &&byCh!=*(((BYTE *)&wAddress)+1) ||

j==1 &&byCh!=*(((BYTE *)&wAddress)+0) )

{

::KernelDelay(10)

bSuccess = FALSE

break

}

}

=================================

知道上位机是怎样发送的,那单片机也应进行相应的接收。最后是将处理好的数据送到使用的地方。。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9980322.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存