STM32/STM8技术论坛
直播中

李俊

8年用户 150经验值
擅长:测量仪表
私信 关注
[问答]

串口接收到浮点数如何解析

最近在做单片机和PLC以modbus方式通信的事情,需要发送浮点数,发现对串口接收数据后怎样处理还有点不明白。比如主机发送一个浮点数(float),占四字节的内存,主机按照顺序将这四个字节连续发出,然后从机接收到这四个字节后,是需要自己写程序来将这四个字节转换为对应的十进制浮点数吗?要不然从机该怎样做?谢谢

已退回10积分

回帖(13)

贺工

2016-10-23 22:06:00

分享大家一个学习单片机与嵌入式的地方,可以关注一下微信公众号【玩转单片机与嵌入式】,每天都会分享三篇有价值的文章,通过碎片化的学习时间,提高自己的水平。
举报

夏贤士

2016-10-23 22:22:18
我是把他转换成文本的
举报

李俊

2016-10-24 08:50:55
引用: xia2742 发表于 2016-10-23 22:22
我是把他转换成文本的

那怎么校验呢,MODBUS需要进行CRC检验,需要将帧数据每次取出8位进行运算,如果不先将浮点数转换为二进制或者十六进制,那该怎么校验呢?
举报

cuyebiren

2016-10-24 10:37:57
把地址直接赋给浮点数指针,然后在取指针指向单元的值。单片机会自动按浮点数取值
如 : float * fp;  fp = (flaot *)&buf[5];   *fp;
举报

654524

2016-10-24 11:35:54
我觉得你把浮点的四个字节,原封不动的以二进制发出去,。接收端再以uint8类型从地址tab(变量名,只是举个例子)存放,原封不动的接收。最后定义一个浮点数指针float* p = tab  。P就是那个浮点数了
举报

李俊

2016-10-24 11:49:06
引用: cuyebiren 发表于 2016-10-24 10:37
把地址直接赋给浮点数指针,然后在取指针指向单元的值。单片机会自动按浮点数取值
如 : float * fp;  fp = (flaot *)&buf[5];   *fp;

那怎么校验呢,MODBUS需要进行CRC检验,需要将帧数据每次取出8位进行运算,如果不先将浮点数转换为二进制或者十六进制,那该怎么校验呢?
举报

李俊

2016-10-24 11:49:29
引用: he07413 发表于 2016-10-24 11:35
我觉得你把浮点的四个字节,原封不动的以二进制发出去,。接收端再以uint8类型从地址tab(变量名,只是举个例子)存放,原封不动的接收。最后定义一个浮点数指针float* p = tab  。P就是那个浮点数了

那怎么校验呢,MODBUS需要进行CRC检验,需要将帧数据每次取出8位进行运算,如果不先将浮点数转换为二进制或者十六进制,那该怎么校验呢?这个才是我真正的目的
举报

cuyebiren

2016-10-24 18:17:33
不是应该先校验成功再用数据吗?接受buf[]是8位的,直接CRC校验啊。8位数据是可以和32位float相互转换的,就是通过指针。
举报

李俊

2016-10-24 23:16:55
引用: cuyebiren 发表于 2016-10-24 18:17
不是应该先校验成功再用数据吗?接受buf[]是8位的,直接CRC校验啊。8位数据是可以和32位float相互转换的,就是通过指针。

我是用matlab做主机,发给PLC,要先生产CRC
举报

李俊

2016-10-24 23:17:18
引用: cuyebiren 发表于 2016-10-24 18:17
不是应该先校验成功再用数据吗?接受buf[]是8位的,直接CRC校验啊。8位数据是可以和32位float相互转换的,就是通过指针。

我是用matlab做主机,发给PLC,要先生产CRC
举报

cuyebiren

2016-10-26 10:48:06
计算机是用二进制计算的。float数据通过位操作,每次取8位,或者通过指针付给8位数组,就可以进行CRC了
举报

654524

2016-10-27 10:18:25
引用: 布莱恩 发表于 2016-10-24 11:49
那怎么校验呢,MODBUS需要进行CRC检验,需要将帧数据每次取出8位进行运算,如果不先将浮点数转换为二进制或者十六进制,那该怎么校验呢?

ModBus 发送的时候最后两个字节是CRC校检,ModBus发送一个浮点数的时候,也是直接拆分成无符号char类型,然后根据大小端换一下顺序吧,确定好发送数据的顺序之后进行CRC校检,把校检结果放在一帧的结尾。接收到之后直接对数据进行CRC校检,然后还原浮点数。
举报

王岩辉

2017-2-21 15:53:29
如果你两端都进行浮点数的计算的话,会比较费资源,不确定发送端的浮点数是如何来的,如果是通过计算得来的,建议不计算直接发,然后到从机处先校验,再计算成浮点数。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分