搜索
bottom↓
回复: 15

浮点型数据通过串口发送

[复制链接]

出0入0汤圆

发表于 2016-12-18 11:10:43 | 显示全部楼层 |阅读模式
最近用到一款KELLER的压力温度传感器,它发回的数据是16进制的数,然后根据公式可以计算出温度或者压强,但是计算结果是浮点型数据,串口好像直接发送不了!
小弟刚入行,经验不足,试了很多方法都不行,后来想到转化成字符串发送,于是找到了sprintf函数,真是太好用了。相关代码如下:
                //sum是浮点型数
                sum=pow(-1,s)*(1+sum/8388608)*pow(2,m-127);//最终压力值,单位是bar
                    sprintf(a,"%10.8f",sum);
                /******************************************************************
                这一句至关重要,因为串口不能识别浮点型数据,所以用sprintf函数
                将浮点型转换为一个字符串放到预设数组a[10]中,最后再将数组以ACII输出
                *******************************************************************/
       
                for(i=0;i<10;i++)
                    {
                        U1TXREG=a[i];//max485发送数据
                        while(U1STAbits.TRMT==0);//等待发送完毕,这一句不可少,若没有这一句
                                                                        //则会出现数据丢失的现象,仅能发4位数据
                }


我用到的是PIC30F4011单片机!有不妥的地方,还请大神指正!

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2016-12-18 11:21:43 | 显示全部楼层
字符串真浪费字节

出0入0汤圆

发表于 2016-12-18 11:53:28 来自手机 | 显示全部楼层
用共用体或者指针不更简单,4个字节就行了

出0入4汤圆

发表于 2016-12-18 11:55:30 | 显示全部楼层
sprintf比较占地

出0入475汤圆

发表于 2016-12-18 12:21:31 来自手机 | 显示全部楼层
不懂楼主要干嘛,只是要把结果数据送出去吗?还是一定要以ascii方式送出去,前者直接把结果变量的浮点数的四个字节串口发出去就行了,接收端去解析具体表示的是什么值,后者你都用了sprintf了为啥不直接printf打印%f出去就是

出0入0汤圆

发表于 2016-12-18 12:31:22 来自手机 | 显示全部楼层
知道精度的话乘以倍数转化为int型,拆分为8位传送也方便吧

出0入0汤圆

 楼主| 发表于 2016-12-18 18:58:02 | 显示全部楼层
q457344370 发表于 2016-12-18 11:53
用共用体或者指针不更简单,4个字节就行了

是用这个函数吗?
void float_char(float f,unsigned char *s)
 { 
         unsigned char *p;   
         p = (unsigned char *)&f; 
        *s = *p; 
            *(s+1) = *(p+1);     
        *(s+2) = *(p+2);     
        *(s+3) = *(p+3); 
}
我试了一下,这个貌似不太好用!

出0入0汤圆

 楼主| 发表于 2016-12-18 19:04:36 | 显示全部楼层
1a2b3c 发表于 2016-12-18 12:21
不懂楼主要干嘛,只是要把结果数据送出去吗?还是一定要以ascii方式送出去,前者直接把结果变量的浮点数的 ...

刚接触到这个单片机,貌似没大有库,基本都是对寄存器操作,也能使用printf吗?
我主要是把传感器的数据通过串口发送到电脑上通过串口调试助手显示出来,因为传感器发送的是十六进制数,还需要根据相应的公式将十六进制数转化成二进制数,
再取二进制数的不同部分计算压强或者温度,这部分工作,我也交给单片机完成了,但是计算结果是浮点型的数据,所以通过我用的方法发出去。

我试了下用指针的那个方法是下面这个函数吗?

void float_char(float f,unsigned char *s) 

         unsigned char *p;   
         p = (unsigned char *)&f;     
         *s = *p; 
            *(s+1) = *(p+1);     
         *(s+2) = *(p+2);     
         *(s+3) = *(p+3);
 }

我按照上面这个函数做,好像不大行!大神求解!

出0入0汤圆

 楼主| 发表于 2016-12-18 19:13:52 | 显示全部楼层
pengchhui 发表于 2016-12-18 12:31
知道精度的话乘以倍数转化为int型,拆分为8位传送也方便吧

我计算的结果是浮点型数据,如果将其乘以10的倍数,再将其强制转化为整型,再按位发送的话,我在串口调试助手上面能看到浮点型乘以10的倍数的数据吗?

出0入0汤圆

 楼主| 发表于 2016-12-18 19:18:01 | 显示全部楼层
q457344370 发表于 2016-12-18 11:53
用共用体或者指针不更简单,4个字节就行了

比方说,计算结果是1.2345的浮点数,按照指针的那个方法发送,我在串口调试助手上面能看到1.12345这个数吗?

是下面这个函数吗?
void float_char(float f,unsigned char *s)

        unsigned char *p;   
         p = (unsigned char *)&f;     
        *s = *p; 
            *(s+1) = *(p+1);     
        *(s+2) = *(p+2);     
        *(s+3) = *(p+3); 
}

我试了一下,不大好使!

出0入0汤圆

发表于 2016-12-18 19:36:03 | 显示全部楼层
不用转成字符,使用共用体union
union senddata{
float a;
uint8_t b[4];
}
发送b[0]~b[4]。

出0入0汤圆

发表于 2016-12-18 20:02:35 | 显示全部楼层
gliet_su 发表于 2016-12-18 19:36
不用转成字符,使用共用体union
union senddata{
float a;

这叫联合体吧,我以前也这样用,往eprom里面存浮点数

出0入0汤圆

 楼主| 发表于 2016-12-18 20:06:17 | 显示全部楼层
gliet_su 发表于 2016-12-18 19:36
不用转成字符,使用共用体union
union senddata{
float a;

我在C语言编译器上模拟了一下,你帮我看看,有啥问题!我输出不行呀!

#include <stdio.h>
union senddata
{
    float f;
    unsigned char a[4];
};

int main()
{
    float sum=1.1234;
    int i;
    senddata r_1;
    r_1.f=sum;

    for(i=0;i<4;i++)
    {
        printf("%c",r_1.a);
    }

}

出0入0汤圆

 楼主| 发表于 2016-12-18 20:07:30 | 显示全部楼层
snail_dongbin 发表于 2016-12-18 20:02
这叫联合体吧,我以前也这样用,往eprom里面存浮点数

大神看看是这样吗?
#include <stdio.h>
union senddata
{
    float f;
    unsigned char a[4];
};

int main()
{
    float sum=1.1234;
    int i;
    senddata r_1;
    r_1.f=sum;

    for(i=0;i<4;i++)
    {
        printf("%c",r_1.a);
    }

}
这是我在C语言编译器里面模拟的!

出0入4汤圆

发表于 2016-12-18 20:26:34 | 显示全部楼层
往事如烟 发表于 2016-12-18 20:07
大神看看是这样吗?
#include
union senddata

用16进制显示了吗

出0入0汤圆

发表于 2016-12-18 20:30:14 | 显示全部楼层
你是要打出来啊,如果是这样用sprintf函数就好了。
如果是通过串口传输到上位机或与其它单片机通信,就用共用体。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 08:50

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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