<1>定位时UTC时间hhmmss 格式
<2>状态A=定位差悄V=导航
<3>经度ddmm.mmm 格式
<4>经度方向N 或S
<5>纬度巧培dddmm.mmmm
<6>纬度方向E或W
<7>速率
<8>方位(二维方向指向,相当于二维罗盘)
<9>当前UTC日期ddmmyy 格式
<10>太阳方位
<11>太阳方向
新年好啊!元旦晚上和同学喝了点酒…… 有点睡不着觉就上来闲逛洞圆……
弄了1个多小时终于亏颤空看出来了……
发现3个问题~~
1.float有可能丢一位精度,不知道你那里的具体环境是什么样子,int多长?long多长?有没有double? 好吧,一般的float精度只有6-7个有效数字,必然的有误差。
2.看这句: i[n-1]=(uchar) p[0]%10 还有这句j[n-1]=(uchar) p[1]%10
p[0]可是个8位数,p[1]是个9位数啊。你把它转成ucahr是活生生的截断啊。
3.这个是笔误吧????
(unsigned long) floor(p[0]*1000000+0.5) //变成长整型
将其改为
p[0] = (unsigned long) floor(p[0]*1000000+0.5) //变成长整型
另一处同上。
这销瞎个程序看起来不怎么样的……
附上我用GCC调试通过的完整代码:
#include <stdio.h>
#include <math.h>
typedef unsigned char uchar
////////////////// i,j分别为纬度和经度。小数点后面6位
void db_2_str(uchar i[], uchar j[], double p[2]) {
uchar n
p[0] = (unsigned long) floor(p[0]*1000000+0.5) //变成长整型
// printf("Debug: %f\n", p[0]) //我加的用于调试的临时语句。
for (n=9n!=0n--) {
i[n-1] = (long)p[0] % 10
i[n-1] = i[n-1]+48
p[0] = p[0]/10
}
i[0]=i[1] i[1]=i[2] i[2]='.'//将小数点插入第三个位置
p[1] = (unsigned long) floor(p[1]*1000000+0.5)
for (n=10n!=0n--) {//j比i 多一位,小数点前有3位
j[n-1] = (long)p[1] % 10
j[n-1] = j[n-1]+48
p[1] = p[1]/10
}
j[0]=j[1] j[1]=j[2] j[2]=j[3] //小数点插入第四个位置
j[3]='.'
}
int main() {
uchar n1[10], n2[10]
n1[9]='\0' n2[10]='\0'
double n[2]={22.222222, 222.222222}
db_2_str(n1, n2, n)
printf("%s\n%s", n1, n2)
return 0
}
主程序功能为51单片机通氏腊过串口向GPS模块GARMIN GPS 25LP发送命令,读取当前的方位信息,根据方位信息数据结构的特歼和滑点,接收GPS模块送入单片机串口的经度数据,关于纬度数据的接收,程序实现代码结构和经度数据接收程序代码类棚老似处理即可。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)