这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 单片机浮点数转十六进制,串口接收浮点数处理

共1条 1/1 1 跳转至

单片机浮点数转十六进制,串口接收浮点数处理

菜鸟
2018-11-28 22:05:28     打赏

浮点转十六进制:
/*作用:浮点数---转---十六进制 */
union fnum
{
long int m;
float f;
};
然后需要在引用的函数内声明共用体比如:
union fnum num;

用法:共用体是将 多个成员变量共用一个地址,并且同一时刻只允许1个成员变量被赋值,当某个成员变量修改后,其他的成员立刻改变,
比如:num.f=6.91;那么num.m=0x40DD1EB8;
当num.f=6.0时,另一个成员变量也改变num.m=40C00000
因为,单片机的十进制和十六进制都可以进行直接计算,所以用以上办法就可以实现浮点数转十六进制.

通俗的讲:共用体就像一个容器,成员变量就是不同形状的容器出口,当我们把1个圆形的物体放进去,如果这时我们像要一个方形的物体,那么就从方形的出口将物体取出,就得到方形了,
同理,我们要浮点转十六进制,就把浮点放进共用体(num.f=6.91),然后从整形取出( Rec=num.m )

细节问题:
因为浮点数转成十六进制后,通常都是32位数据,所以我们在取出整形数的时候要 用一个32位的变量(long int,或者u32 ) 去存.

2. 共用体和结构体的区别
  共用体和结构体有下列区别:

  1. 共用体和结构体都是由多个不同的数据类型成员组成,  但在任何同一时刻, 共用体只存放了一个被选中的成员, 而结构体的所有成员都存在。  2. 对于共用体的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了,  而对于结构体的不同成员赋值是互不影响的。 另外要注意的是,


计算串口接收到的浮点数:
我们通常在接收到串口的数字时, 基本上都是文本类型的数字, 并且是一位一位的文本,
比如6.19就是 ‘6’, ’.’ , ’1’ , ’9’
我们将它重新变为6.19需要进行一下操作:
Arr[]={‘6’,’.’,’1’,’9’}

1. 所有文本类型的数字只有 减零 之后才可以进行计算,否则是文本型.
  Arr[0]-‘0’;
2. 特别注意


sum_num= (float)(arr[6]-'0')+
(float)(arr[8]-'0')/10 +(float)(arr[9]-'0')/ 100;
在计算的时候,小数部分要转换成 小数,然后进行相加,
注意的是 在(float) (arr[8]-'0')/10的时候, 前面要先强制装换成(float)之后 才可以/10,这样才是把 1变成0.1,
如果在/10之前 没有(float)的话,意味着取10的倍数,
如果是 1/10,不加(float),那就等于0;最后相加就等于6.00000;
正确:


3. 注意细节:
成功将Arr[]={‘6’,’.’,’1’,’9’}
组合成sum_num =6.19之后, 在进行判断sum_num时:
if(sum_num == 62.91f) { LED1=0; }
注意这里的62.91后面加f,如果不加会报警告:
:单精度操作数隐式转换为双精度
当if(sum_num == 62.91) { LED1=0; }
这里的sum_num是浮点型,而62.91默认是双精度类型的;
当2个不同类型的变量 相加减时,会将二者都转换成较大一方的类型,
所以 浮点数 和 双精度进行判断时:浮点数会被转换成双精度.所以会报警告,告诉你这里进行了这样的操作.
当if(sum_num == 62.91f) { LED1=0; }这里的62.91f
是将62.91转换成浮点数
浮点数 和 浮点数进行判断 或者 计算,并不会转换成双精度,警告自然没了





关键词: 十六进制     串口     接收    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]