打印

【请问】44b0如何将浮点数打印到串口助手上去呢???

[复制链接]
4583|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
quiza|  楼主 | 2008-1-9 11:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在程序的某些断点上向串口调试助手发送一些变量,便于调试时观察变量变化
整形、字符串都没问题,但是浮点数串口助手显示的不正确:
a=        00 
b=1?500000 
程序中对应的代码为:
Uart_Printf("a=%10.2d  ",a);    
Uart_Printf("b=%f  ",b);
请问是不是我printf的格式用错了?

相关帖子

沙发
老狼| | 2008-1-9 15:53 | 只看该作者

我还是奉劝一句

这种不带浮点的CPU,不要使用浮点,效率太低!
就上面的例子,你得到的一手数据肯定是整数型的,不必化成浮点型,然后发送,直接发送整数到串口,修改 Uart_SendString(string);效率要高得多。

不要使用系统的Printf这一类函数,能直接调用硬件,就不要用这一类的系统函数,很占资源,我现在写程序,很多函数都自己写,比库函数快多了,例如开方函数,那个库函数效率太低了。


使用特权

评论回复
板凳
quiza|  楼主 | 2008-1-9 17:03 | 只看该作者

我把代码贴出来,看看这个如何用整数优化

最小二乘法(根据最近5次lc与hi的关系,拟合直线,得到y=k1x+k2系数a,b)
float x,y,sx,sy,sxx,syy,sxy,k1,k2,r;
U32 i;
U16 lc[5],hi[5];

    sx=0;
    sy=0;
    sxx=0;
    syy=0;
    sxy=0;

    lc[1]=1;
    hi[1]=1;
    lc[2]=2;
    hi[2]=2;
    lc[3]=3;
    hi[3]=3;
    lc[4]=4;
    hi[4]=4;
    lc[5]=5;
    hi[5]=5;
    
    for (i=0;i<5;i++)
    {
        x=lc;
        y=hi;

        sx=sx+x;
        sy=sy+y;
        sxx=sxx+x*x;
        syy=syy+y*y;
        sxy=sxy+x*y;
    }
    
    k1=(5*sxy-sx*sy) /(5*sxx-sx*sx);                        //
    k2=sy/5-k1*sx/5;                                        //
    r=(5*sxy-sx*sy)/(sqrt(5*sxx-sx*sx)*sqrt(5*syy-sy*sy));    //相关系数

不知道这样如何用整数方式来优化?谢谢老狼!

使用特权

评论回复
地板
老狼| | 2008-1-9 18:27 | 只看该作者

在计算机内部都是以二进制计算为最快捷


不管是浮点数还是整数,在计算机内部都是以二进制计算为最快捷的.因此,计算和保存应该使用二进制,只有需要显示的时候才需要转换成十进制数,以及其它形式的数. 

1.根据系统的实际,确定数据处理过程中小数点后应该保留的有效位数是多少,比如是5位,那么参与运算的数据全部放大,乘上100000. 

2.确定计算过程中最大值(乘上100000的值),是否超过系统中整数的表达范围. 

如果上2条满足,就适合将浮点转换成整数计算了. 

============================================ 
用个简单例子看具体的处理和设计. 

假定一个系统通过测汽车轮子转速来计算距离,一个脉冲表示轮子转一圈,轮子的直径为0.485米.那么理论计算公式是: 
       S = N * 3.1415926... * 0.485 
       S 为距离(米) 
       N 为脉冲个数(肯定是整数) 

   那么我们就要首先确定计算结果的精度.根据实际情况,距离的精度到达毫米即可.因此计算中的精度为毫米.这样轮子的直径为485.0毫米,4位有效数字.然后将3.1415926变成整数31416,放大10000,5位有效(保证计算精度). 
    
   那么S = (N * 31416 * 485) / (10000) 毫米   ====>(2) 

   接下来看无符号长整型数为4个字节,表示最大数为:4294967295,那么: 4294967295 / 31416 / 485 ==  281.88 (N的值) 
   因此,2式中的N最大不能超过281. 

   取N为280,为1秒内轮子转动的圈数,则280*3.1416*0.485 = 426.63米/秒  换算成公里/小时为:1535.85公里/小时!! 
   实际汽车的速度不可能这么快,所以N不会超过280个/每秒.2式可以使用. 

   这样浮点的计算换成了整数计算. 

   系统可以每一秒计算一次: 
   将在一秒内测得的圈数N,按N*31416*485计算(纯整数计算). 
   计算结果的小数点左移7位显示速度(米/秒), 
   计算结果除10000(单位毫米)送距离累加. 

//-----------------------------------------------------------------
以上是别人的帖子。转过来的,自己写太麻烦!文中一个观点我不赞同,“2.确定计算过程中最大值(乘上100000的值),是否超过系统中整数的表达范围”,如果,32位不能保证精度怎么办?那就扩呀,扩展成64位,哈哈,方法和51单片机实现方式差不多。这种方法实现起来确实不如直接用浮点方便,但是速度快多了,sqrt也不能调用库函数,找一个整数开方的函数。

使用特权

评论回复
5
quiza|  楼主 | 2008-1-9 21:42 | 只看该作者

多谢老狼指点!

事实上,现在做的系统就包含了里程测距功能,实现的方法和老狼转贴内所述基本思想是一致的,的确速度上加快了不少,但是不够直观,需要注释,如果对精度、分辨率要求很高时,就需要注意是否会溢出。所以现在想想还不如用浮点做呢,虽然慢点,好在系统实时性要求不高,上面我列的那个代码段,用软件浮点处理的话,在SDRAM里运行耗时270us,在FLASH里运行耗时780us,基本是可以接受的

使用特权

评论回复
6
wangshujun| | 2008-1-17 09:48 | 只看该作者

找一下老帖子,ads的浮点格式可以配置,通过配置国家选项

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

48

主题

102

帖子

1

粉丝