打印

单片机发送float型的数是个小数,是不是要按位提取

[复制链接]
1374|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hanwe|  楼主 | 2021-11-5 21:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机发送float型的数是个小数,是不是要按位提取

使用特权

评论回复
沙发
pengf| | 2021-11-5 21:41 | 只看该作者

浮点数不就是数字加一个小数点,不能转成字符串发送吗?

使用特权

评论回复
板凳
jiajs| | 2021-11-5 21:42 | 只看该作者
怎么发不重要,重要的是你用什么格式表达小数,按照单片机里的“既定格式”还是自己的规范,要按“既定格式”可以用共用体来拆分,按自己的格式可以扩大成定点整数发送。

使用特权

评论回复
地板
hanwe|  楼主 | 2021-11-5 21:44 | 只看该作者
我是把float数按位提取后,再每一位转化成ASC码传送的,这样可以吗?还有别的方法吗?

使用特权

评论回复
5
llia| | 2021-11-5 21:46 | 只看该作者
由接收方处理小数,发送方直接发原始数

使用特权

评论回复
6
supernan| | 2021-11-5 21:48 | 只看该作者

可以先变成整数再发送。
比如:发一个字节数据0.032.在单片机里乘以1000,发送数据为32
在上位机接收的时候除以1000即可。

使用特权

评论回复
7
wuhany| | 2021-11-5 21:50 | 只看该作者
直接发送4字节float类型不就行了? 建议楼主研究一下不同数据类型存储是咋回事

使用特权

评论回复
8
zwll| | 2021-11-5 21:52 | 只看该作者

方法一:格式化成字符串发送
方法二:根据精度调整成整数发送,如6L所述。
方法三:如果双方的平台一致,也可以直接发送变量本身的二进制,如3L所述。

使用特权

评论回复
9
dingy| | 2021-11-5 21:54 | 只看该作者

转换成ASCII码传送,接收到再还原。最省事,但传输时间长一些。
直接发送4字节Float 数据,传输时间短,需要严格的协议。
可以把浮点数据的阶码除2,尾数依次右移一位,发送五字节接收到再还原,除了动态范围小一一些以外应该是个不错的选择。(BIT7可以做命令指示标志)

使用特权

评论回复
10
dengdc| | 2021-11-5 21:56 | 只看该作者
串口协议问题, 个人喜欢放大N倍发送, 上位机再出除N倍

使用特权

评论回复
11
jlyuan| | 2021-11-5 22:02 | 只看该作者
发送端:
float a = 1.12345;
char* p ;
p = char*(&a);
for(char i = 0;i<sizeof(a);i++)
{
   send(*p);
   p++;
}

接收端:
float a = 1.12345;
char* p ;
p = char*(&a);
for(char i = 0;i<sizeof(a);i++)
{
   *p = sbuf;
   p++;
}

使用特权

评论回复
12
jlyuan| | 2021-11-5 22:05 | 只看该作者
正解,直接发float那四个字节是最高效的方法,两边对float的格式定义必须一样

使用特权

评论回复
13
stly| | 2021-11-5 22:08 | 只看该作者

union data
{  
      char cvalue [4];
      float fvalue
};
a.fvalue = 1.234 ;
a.cvalue[0];
a.cvalue[1];
a.cvalue[2];
a.cvalue[3];

是不是也可以按上面这种结构体这种思路去思考,直接send(a.cvalue[ …])

使用特权

评论回复
14
renyaq| | 2021-11-5 22:11 | 只看该作者
MCU还是别用浮点数吧。

使用特权

评论回复
15
pengf| | 2021-11-5 22:13 | 只看该作者
格式先弄清楚了

使用特权

评论回复
16
dengdc| | 2021-11-5 22:16 | 只看该作者

换成整数发
接收端再处理

使用特权

评论回复
17
jlyuan| | 2021-11-5 22:18 | 只看该作者
乘以一个倍数就可以了吧

使用特权

评论回复
18
renyaq| | 2021-11-5 22:21 | 只看该作者

存储和解释是两种事情
不管神马数据类型,在计算机存储和通讯上都是0101,怎么解释这个0101那是另外的事情

使用特权

评论回复
19
renyaq| | 2021-11-5 22:22 | 只看该作者

单片机内 浮点数是按ieee754存储并运算的
直接发送 4个字节 就成 11楼,12楼,13楼都不错

使用特权

评论回复
20
hanwe|  楼主 | 2021-11-5 22:24 | 只看该作者
多谢大家讨论这么多哈,呵呵

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

979

主题

8749

帖子

4

粉丝