求GPS模块与51单片机之间通信的c程序

求GPS模块与51单片机之间通信的c程序,第1张

$GPRMC、 <1>、<2>、<3>、<4>、虚宽渣<5>、<6>、<7>、<8>、<9>、<10>、<11>、*hh<CR><LF>

<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模块送入单片机串口的经度数据,关于纬度数据的接收,程序实现代码结构和经度数据接收程序代码类棚老似处理即可。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/yw/12493674.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存