单片机如何串口发送数值,带小数点的

[复制链接]
19663|29
 楼主| michaelpan 发表于 2010-6-7 21:40 | 显示全部楼层 |阅读模式
请问大家,我想用单片机一直发送一个float型的数,是个小数,是不是要按位提取啊?
aresc 发表于 2010-6-7 22:01 | 显示全部楼层
浮点数不就是数字加一个小数点,不能转成字符串发送吗?
NE5532 发表于 2010-6-7 22:22 | 显示全部楼层
怎么发不重要,重要的是你用什么格式表达小数,按照单片机里的“既定格式”还是自己的规范,要按“既定格式”可以用共用体来拆分,按自己的格式可以扩大成定点整数发送。
 楼主| michaelpan 发表于 2010-6-7 22:38 | 显示全部楼层
我是把float数按位提取后,再每一位转化成ASC码传送的,这样可以吗?还有别的方法吗?
ayb_ice 发表于 2010-6-8 08:15 | 显示全部楼层
由接收方处理小数,发送方直接发原始数
wxw2000 发表于 2010-6-8 09:23 | 显示全部楼层
可以先变成整数再发送。
比如:发一个字节数据0.032.在单片机里乘以1000,发送数据为32
在上位机接收的时候除以1000即可。
音乐乐乐 发表于 2010-6-8 10:26 | 显示全部楼层
直接发送4字节float类型不就行了? 建议楼主研究一下不同数据类型存储是咋回事
原野之狼 发表于 2010-6-8 10:50 | 显示全部楼层
方法一:格式化成字符串发送
方法二:根据精度调整成整数发送,如6L所述。
方法三:如果双方的平台一致,也可以直接发送变量本身的二进制,如3L所述。
bald 发表于 2010-6-8 11:04 | 显示全部楼层
转换成ASCII码传送,接收到再还原。最省事,但传输时间长一些。
直接发送4字节Float 数据,传输时间短,需要严格的协议。
可以把浮点数据的阶码除2,尾数依次右移一位,发送五字节接收到再还原,除了动态范围小一一些以外应该是个不错的选择。(BIT7可以做命令指示标志)
mxh0506 发表于 2010-6-8 13:30 | 显示全部楼层
如果不是自定义的浮点格式,基本上就是IEEE-754格式了,到哪里都一样,最多调整一下大/小端。
andyding 发表于 2010-6-8 17:41 | 显示全部楼层
串口协议问题, 个人喜欢放大N倍发送, 上位机再出除N倍
hgjinwei 发表于 2010-6-8 18:44 | 显示全部楼层
其实,处理器不知道那是什么格式的数据。
southboy 发表于 2010-6-8 19: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++;
}
batsong 发表于 2010-6-8 19:05 | 显示全部楼层
13楼正解,直接发float那四个字节是最高效的方法,两边对float的格式定义必须一样
Quentin 发表于 2010-6-8 20:55 | 显示全部楼层
真是条条大路通马甸啊
zhchyl 发表于 2010-6-8 21:55 | 显示全部楼层
将所有浮点数中的数字发送,再发送一位小数点位置
zhiyonghe 发表于 2010-6-8 22:54 | 显示全部楼层
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[ …])
………………
zhiyonghe 发表于 2010-6-8 22:55 | 显示全部楼层
支持13楼的方法!!很好
pidcy 发表于 2010-6-9 09:18 | 显示全部楼层
你用什么格式表达小数
 楼主| michaelpan 发表于 2010-6-9 21:56 | 显示全部楼层
谢谢大家的大力支持,真的很感谢大家!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

22

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部