查看: 167|回复: 3
收起左侧

[STM32] 串口一直打印出nan是什么情况

[复制链接]

4

主题

12

帖子

36

积分

实习生

 楼主| 发表于 2017-5-7 13:02 | 显示全部楼层 |返回版面||阅读模式
本帖最后由 光阴时钟 于 2017-5-7 13:10 编辑

串口打印不出来,好心塞呀。我用keil调试,程序运行结果是可以的,但是用串口打印结果时,却一直给我打印出nan,有木有人遇过类似情况,可否指点一下,不甚感激呀。。。
以下是我写的GPS模块采点程序,求指点
void Data_gather(void)
{
        unsigned char i=0,j=0,k=0;
        float longtitude_sum=0,latitude_sum=0;
        float S_lon=0,S_la=0,Sum_lon=0,Sum_la=0;
        float longtitude_aver=0,latitude_aver=0;  //取均值
        flag_ok=0;
        if(Save_Data.isParseData==true&&Save_Data.isUsefull==true)
        {
                //考虑到测一点时,度是不会变的,所以只对分计算
                //先采集
                longtitude[pos_collect]=(Save_Data.longitude[3]-0x30)*10+(Save_Data.longitude[4]-0x30)*1+(Save_Data.longitude[6]-0x30)*0.1+(Save_Data.longitude[7]-0x30)*0.01+(Save_Data.longitude[8]-0x30)*0.001+(Save_Data.longitude[9]-0x30)*0.0001;
                latitude[pos_collect]=(Save_Data.latitude[2]-0x30)*10+(Save_Data.latitude[3]-0x30)+(Save_Data.latitude[5]-0x30)*0.1+(Save_Data.latitude[6]-0x30)*0.01+(Save_Data.latitude[7]-0x30)*0.001+(Save_Data.latitude[8]-0x30)*0.0001+0.0000000;
                pos_collect++;
                if(pos_collect>199) //采集完成,滤波,拉伊达准则
                {
                        pos_collect=0;
                        //求均值
                        for(i=0;i<200;i++)
                        {
                                longtitude_sum+=longtitude;
                                latitude_sum+=latitude;
                        }
                        longtitude_aver=longtitude_sum/200;
                        latitude_aver=latitude_sum/200;
                        //求方差S
                        for(i=0;i<200;i++)
                        {
                                Sum_lon+=(longtitude-longtitude_aver)*(longtitude-longtitude_aver);
                                Sum_la+=(latitude-latitude_aver)*(latitude-latitude_aver);
                        }
                        Sum_lon=Sum_lon/199;
                        Sum_la=Sum_la/199;
                        S_lon=sqrt(Sum_lon);
                        S_la=sqrt(Sum_la);
                        //判断数据是否异常
                        for(i=0;i<200;i++)
                        {
                          if(longtitude>3*S_lon)
                                {
                                         longtitude=0;
                                }
                                if(latitude>3*S_la)
                                {
                                         latitude=0;
                                }
                        }
                        //处理完毕,求均值
                        longtitude_sum=0;
                        latitude_sum=0;
                        for(i=0;i<200;i++)
                        {
                                if(longtitude!=0)
                                {
                                        j++;
                                        longtitude=(int)(longtitude*10000);//扩大10000倍,取整减小误差
                                        longtitude_sum+=longtitude;
                                }
                                if(latitude!=0)
                                {
                                        k++;
                                        latitude=(int)(latitude*10000);//扩大10000倍,取整减小误差
                                        latitude_sum+=latitude;
                                }
                         }
             longtitude_aver=longtitude_sum/(j*10000);
                         latitude_aver=latitude_sum/(k*10000);
                         //存入数组
                         Pos_longtitude[num_postion]=longtitude_aver;
                         Pos_latitude[num_postion]=latitude_aver;
                         printf("jingdu=%f",Pos_longtitude[num_postion]);
                        printf("\r\n");
                         printf("weidu=%f",Pos_longtitude[num_postion]);
                        printf("\r\n"); //串口打印

                         num_postion=num_postion+1;
                         flag_ok=1;
                 }
        }
}
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0

322

主题

1万

帖子

4万

积分

版主

---------------------

发表于 2017-5-8 11:10 | 显示全部楼层 |返回版面
比较大的可能性, 应该是没有对上通信协议
欢迎进入 TI 模拟技术论坛

4

主题

12

帖子

36

积分

实习生

 楼主| 发表于 2017-5-8 12:10 | 显示全部楼层 |返回版面
airwill 发表于 2017-5-8 11:10
比较大的可能性, 应该是没有对上通信协议

问题解决了,是我除了个0,所以出现这种结果
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0

21

主题

1270

帖子

5723

积分

高级工程师

发表于 2017-5-14 17:43 | 显示全部楼层 |返回版面
在 printf 函数里, %f 位置的浮点数有问题时,打印出NaN.
可能的还有INF等。
NaN的意思是 Not a Number.
QQ:12902840
QQ群,8875908
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

热门推荐上一条 /2 下一条

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