• [转]串口收发float型数据


    如果是格式化 ,用sprintf / printf; 

    如果发送原始内存数据流, 可按下面发送, 

    发送  
    float a = 1.23; double b=3.2; 
    SendBytes( *(u8*)&a ,sizeof(a) );  
    SendBytes( *(u8*)&b ,sizeof(b) );  

    上位机接到的 十六进制码,再按同样格式转回来。
     如 分别接收到  s1[4] s2[8] 里面, 如果是float 就是4个字节
    *(float*)&s1 就是 a
    *(double*)&s2 就是b

    其中遇到一个头疼的问题是传输的都是浮点型数,但发送接受的是unsigned char型。

    float,占4字节,包括符号位(1位,第31位),指数为(8位,-126~128,22~30位),尾数位(23位,0~22位)

    两种方案

    (1)其实精度要求不高的话,直接把浮点数X100转化成16位或32位整数,在拆分为unsigned char类型发过去,在接收后合并,并强制转化为float在除以100.(不太好放弃)

    (2)直接把float数据拆分为4个unsigned char,发过去,在合并为float。

    我使用方案(2),其中有两点要注意。

    (1)大端存储,小段存储;如果搞错读取数据就不是你接收的数据地址(我主要使用了fpga,arm以及PC机,很有可能存储方式不同,一般可能不需要考虑)

    (2)字对齐。不然就合并不成float(我先前没注意直接一个很怪异的数据)

    发送端:

    void package_frame(const void *data)
    {
        int i;
        for(i=0; i<4; i++)
        {
            send_frame[i] = ((uchar *)data)[i];
        }
    }

    接收端:

    float exchange_data(uchar *data)
    {
     
        float float_data;
        float_data = *((float*)data);
        return float_data;
    }

    将uchar *data首地址付给float_data来合并成float型数据(记得字对齐和大小端存储,不然数据不对)

    其实发整数等大于1字节的数据也一样。

  • 相关阅读:
    SpringMVC是什么?
    SpringMVC工作原理
    SQL给字段加上统一的某个字符
    把数据库里的标签去掉
    Windows通过DOS命令进入MYSQL的方法
    mysql添加字段
    sqlserver查询最接近的记录
    LIST 排序
    Tsk4.5异步
    认识和使用Task
  • 原文地址:https://www.cnblogs.com/tubujia/p/10131807.html
Copyright © 2020-2023  润新知