OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4367|回复: 10

关于往串口发数据的问题(类型转换,小数)

[复制链接]

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2022-3-31
在线时间
16 小时
发表于 2022-4-12 18:26:43 | 显示全部楼层 |阅读模式
2金钱
老哥们,我往串口发一个浮点型数据,将这个浮点转成字符串后,一个字节一个字节的发。
用for循环限定了一个发送长度,如果是发送长度为4。例如发的是1.0000000的浮点,那发的就是1.00四个字节,如果是负数-1.000000,就变成了-1.0;发10.0000000,就变成了发10.0
这种情况有什么好的解决方法吗?
我想直接发具体值比如如上数据都是发到小数点后两位这样,例如上面同样的数据我想要发的是:1.00;-1.00;10.00

最佳答案

查看完整内容[请看2#楼]

%.2f 就是强制保留小数点后2位啊。那你发的时候就sprintf格式化一下然后send(buf , strlen(buf))
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6719
金钱
6719
注册时间
2017-4-12
在线时间
1257 小时
发表于 2022-4-12 18:26:44 | 显示全部楼层
本帖最后由 245925587 于 2022-4-13 15:39 编辑
zzh41 发表于 2022-4-13 14:47
嗷嗷不好意思,其实我的意思是我程序把某个数据处理完了,想要往串口发这个格式的数据,然后别人从这个串 ...

%.2f  就是强制保留小数点后2位啊。那你发的时候就sprintf格式化一下然后send(buf  , strlen(buf))


回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6719
金钱
6719
注册时间
2017-4-12
在线时间
1257 小时
发表于 2022-4-13 11:29:35 | 显示全部楼层
其实数据都是一样的,10.0和10.0不是一样的吗,如果你为了显示必须要10.00,
1、ASCII码格式发送,比如10.00,简单点就发送 frame head ,data_len , data(10.00) , frame end;
2、hex发送,接收的时候,sprintf(buf , "%0.2f",data)-----自己设置保留描述小数点后几位对齐
回复

使用道具 举报

16

主题

426

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2765
金钱
2765
注册时间
2018-11-8
在线时间
438 小时
发表于 2022-4-13 11:38:22 | 显示全部楼层
printf("%4.2f",data);

或者数据直接乘100按整数发 然后用眼睛补小数点
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2022-3-31
在线时间
16 小时
 楼主| 发表于 2022-4-13 14:15:49 | 显示全部楼层
245925587 发表于 2022-4-13 11:29
其实数据都是一样的,10.0和10.0不是一样的吗,如果你为了显示必须要10.00,
1、ASCII码格式发送,比如10. ...

我发的时候是先拿到一个float型数据,然后sprinf(buf,%.3f,那个float变量),然后一个for循环usart->dr=buf;
如果我要发的float他是一个负数,那个符号就会占去一个字节,举个例子:本来想要的是-10.00的数据就变成了-10.0
应该咋弄捏
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2022-3-31
在线时间
16 小时
 楼主| 发表于 2022-4-13 14:16:34 | 显示全部楼层
babyrabbit 发表于 2022-4-13 11:38
printf("%4.2f",data);

或者数据直接乘100按整数发 然后用眼睛补小数点

用printf代替usart->dr也可以吗?
回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6719
金钱
6719
注册时间
2017-4-12
在线时间
1257 小时
发表于 2022-4-13 14:22:47 | 显示全部楼层
zzh41 发表于 2022-4-13 14:15
我发的时候是先拿到一个float型数据,然后sprinf(buf,%.3f,那个float变量),然后一个for循环usart->dr= ...

你接收这边处理啊,不管正负,你可以强制设置小数点几位对齐的啊
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2022-3-31
在线时间
16 小时
 楼主| 发表于 2022-4-13 14:47:51 | 显示全部楼层
245925587 发表于 2022-4-13 14:22
你接收这边处理啊,不管正负,你可以强制设置小数点几位对齐的啊

嗷嗷不好意思,其实我的意思是我程序把某个数据处理完了,想要往串口发这个格式的数据,然后别人从这个串口收,至于他那边怎么处理我不清楚。
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2022-3-31
在线时间
16 小时
 楼主| 发表于 2022-4-13 15:56:21 | 显示全部楼层
245925587 发表于 2022-4-13 15:38
%.2f  就是强制保留小数点后2位啊。那你发的时候就sprintf格式化一下然后send(buf  , strlen(buf))

懂了,谢谢您!
回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3359
金钱
3359
注册时间
2011-11-10
在线时间
207 小时
发表于 2022-4-13 18:21:25 | 显示全部楼层
1. 如果你不明确数值的范围,sprintf格式化后打印输出,接收方再将字符转换成数字就可以了。2. 如果你清楚知道这个数值的范围,那直接通过×和+运算将该数值转换成整数,然后串口发出,接收方再通过逆运算就可以得到原来数据了。   第二种方法程序运行效率要高得多。
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2022-3-31
在线时间
16 小时
 楼主| 发表于 2022-4-14 08:35:34 | 显示全部楼层
c2007s 发表于 2022-4-13 18:21
1. 如果你不明确数值的范围,sprintf格式化后打印输出,接收方再将字符转换成数字就可以了。2. 如果你清楚 ...

谢谢,了解了,第二种方法是我先自己帮MCU算好,然后收发是吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 14:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表