资源描述
南 阳 理 工 学 院本科生毕业设计(论文)学院(系):计算机与信息工程学院专 业: 通信工程 学 生: 刘丹 指导教师: 周国运 完成日期 2012 年 4 月南阳理工学院本科生毕业设计(论文)基于ARM-LINUX的GPS导航系统Design and Development of Office Automation System总 计:毕业设计(论文)-页表 格:-个插 图:-幅南 阳 理 工 学 院 本 科 毕 业 设 计(论文)基于ARM-LINUX的GPS导航系统Design and Development of Office Automation System学 院(系): 计算机与信息工程学院 专 业: 通信工程 学 生 姓 名: 刘丹 学 号: 0671080 指 导 教 师(职称): 周国运(教授) 评 阅 教 师: 完 成 日 期: 2012年4月 基于ARM-LINUX的GPS导航系统 刘丹 摘要:本系统由GPS数据采集并显示、地图显示两大部分组成,模拟GPS导航的过程。通过GPS模块、arm9硬件环境、嵌入式LINUX操作系统、TFT触摸屏等模块来完成整个体系的运作,使其实时采集GPS数据,然后将GPS数据对应的地图显示出来,再利用串口将数据送入PC机数据库中实现查询等一系列功能。本设计的特点在于界面友好、用户易操作、功耗低、便于长时间户外导航。关键词:ARM;LINUX;GPS;C+语言;SHELL编程;嵌入式操作系统 The ARM-LINUX-based GPS navigation systemLiu dan Abstract: This system consists of GPS data collection, map display composed of two parts, simulated GPS navigation process. Through the GPS module, arm9 hardware environment, embedded LINUX operating system, TFT touch screen and other modules to complete the operation of the entire system to collect real-time GPS data, GPS data and then display the corresponding map, re-use the data into the PC serial port machine in the database queries, and so to achieve a series of functions. This design feature is user-friendly, user easy to operate, low power consumption, easy to navigate a long time outdoors.Keywords: ARM; LINUX; GPS; C + + language; SHELL programming; embedded operating system 目录2.3.4.引言GPS 是英文Global Positioning System(全球定位系统)的简称,而其中文简称为“球位系”。GPS是20世纪70年代由美国陆海空三军联合研制的新一代空间卫星导航定位系统 。其主要目的是为陆、海、空三大领域提供实时、 全天候和全球性的导航服务,并用于情报收集、核爆监测和应急通讯等一些军事目的。随着人民生活水平的法杖,GPS技术被越来越多的应用在个人PDA、个人车载终端、 等个人设备上。人们通过手持GPS,能准确知道自己所在的位置,从实现到导航、确定旅游路线、获取地理信息等功能。本文介绍的GPS导航系统,以ARM作为主控芯片,配以GPS、TFT触摸屏、嵌入式LINUX操作系统,构建了一个集GPS信息显示、地图显示、语音导航为一体的完整系统。本系统在一定程度上推动了个人手持GPS导航设备研究的发展。1 系统方案选择和论证1.1 总体设计方案个人手持设备要求界面美观、功耗低、易于操作。系统应有彩色触摸屏;低功耗、高速度的处理芯片;带有嵌入式操作系统;GPS信息接收模块;sd卡用以存放地图;TFT触摸屏模块框图分别如图1所示:Nor flash Nand flashSd卡(存放地图)Gps模块S3c2440串口(调试及下载)电 源图1 系统结构框图Fig.1 System Structure Diagram1.2 部分模块设计方案 控制模块设计方案方案一:采用凌阳公司的16位单片机,它是16位控制器,具有体积小、驱动能力高、集成度高、易扩展、可靠性高、功耗低、结构简单、中断处理能力强等特点。用于语音处理和识别等领域。满足系统GPS模块和语音导航功能的需要。由于本系统需要彩色人机交互界面,对处理速度要求较高,故不采用。方案二:采用samsung公司的s3c2440。S3c2440采用ARM920t内核,实现了MMU、ARBA、BUS和Harvard高速缓冲体系结构。是一块高性能、低功耗的嵌入式芯片。可植入操作系统。在个人PDA领域应用及广。植入操作系统后,在用户GUI编程方面具有很大优势。内置AD/DA,便于扩展语音模块。故选用此芯片为主控芯片。1. 2. 2 操作系统选择方案Linux操作系统广泛应用在嵌入式设备中,其源代码开放、免费;内核性能高效、多任务、可制定;完善的图形管理、文件管理机制;良好的开发环境、强大的工具集。可移植QT开发环境,可实现跨平台的编译,代码重用率高。 GPS模块选择方案方案一:采用串口接口GPS模块。优点:便于驱动,价格便宜。缺点:嵌入式linux的调试需要用到串口,若GPS模块占用了串口会造成调试不便。故不采用方案二:采用usb接口GPS模块。优点:便于携带、连接开发板。缺点:驱动相对较难、价格相对较贵。为了便于调试和携带,采用usb接口GPS模块。显示模块设计方案方案一:采用LCD显示。液晶显示屏(LCD)具有轻薄短小,低耗电量。但不能实现触摸功能,故部采用。方案二:采用TFT显示。TFT屏幕带有四线式电阻触摸膜,能实现触摸功能、便于用户操作,故采用。地图文件存放方案方案一:采用s3c2440核心板内置nand flash 存放。Nand flash 读取速度快。但容量较小,只有128M,不适合存放大量地图数据,故不采用。方案二:采用外置sd卡。Sd卡读取速度相对较慢,且会增加成本。但能存放大量数据(),地图更新升级也很方便。故采用。1.3 总体方案确定1) 控制芯片: 采用s3c2440 arm9 处理器2) 液晶显示模块: 采用NEC TFT 3.5 寸屏幕3) GPS模块: 采用三星公司的GPS-USBII模块4) nand flash: 采用 K9F1208;5) nor flash: 采用 AM29LV160DB5) 音频处理芯片: UDA1341TS;6) SD卡 模块: 采用金士顿公司的 4GB SD卡;7) 电源模块: 采用两个8V可充电锂电池;8) 操作系统: 采用嵌入式linux操作系统2 系统的硬件设计与实现 系统硬件采用友善之臂的s3c2440 mini2440开发板。Mini2440 体积小,便于携带;接口丰富,易于扩展;功耗低,便于长时间户外导航。Mini2440硬件特性如下图:图2 主控芯片电路 Master-chip circuitry2.1 主控芯片电路主控芯片为s3c2440的6层核心板,该核心板性能稳定、工艺精良。图2.1 主控芯片电路Fig. Circuit of ultrasonic transmitting and receiving2.2 flash芯片电路2.21 nand flash芯片电路Nand flash 是操作系统的程序存储区,该芯片掉电不丢失数据、寿命长,可反复擦写。芯片容量128M。适合存放高密度数据结构图 主控芯片电路Fig. Circuit of ultrasonic transmitting and receiving 2.22 nor flash芯片电路Nor flash是系统 BIOS 存储区。该芯片掉电不丢失数据、寿命长,可反复擦写。芯片容量8M。适合高速度、低数据密度的数据结构。 图 主控芯片电路 Fig. nor flash chip circuitry2.3 串口电路 采用max3232电平转换芯片与计算机通信图2.3 串口电路Fig. Serial circuit2.4 usb端口电路采用usb2.0协议,usb接口用以连接gps模块图2.4 usb端口电路Fig. Driving circuit2.5 系统总线及lcd接口电路系统总线及lcd接口电路Fig. Driving circuit2.6 电源电路图2.6 电源电路Fig.6 Power circuit3 系统的软件设计本系统的所有程序均采用C+语言编写,开发工具为QT embed 2.0。程序定义了许多类来分别管理各个模块,通过对各个类的操作,来构建整个程序框架。3.1 程序整体结构框图图3.1 maintab类流程图 Fig.3.1 Diagram of the overall structure of program3.2 Maintab类 Maintab 类负责程序外框基本定义及程序初始化 开始 设置好卫星信号强度数据设置窗口大小、颜色显示窗口图3.2 maintab类流程图 Fig.3.2 maintab Class Flowchart3.3 mainwidgt类Mainwidgt类负责对各个按钮部件、页面部件的初始化开始 定义GPS时钟 绘制主框 绘制上下左右四个按键 绘制三个页面标签 连接点击按钮事件与处理按键程序 结束图3.3 mainwidget 类流程图Fig.3.3 mainwidget class Flowchart3.4 config类流程图Config类用以实现对地图路径、gps模块波特率的设置 开始 设置地图路径 设置gps的波特率 结束图3.4 config 类流程图Fig.3.4 config class Flowchart 3.5 map类Map类负责读取mapinfo文件里的地图 ,并显示对应地图。地图显示算法:首先把地图分割成n*n小块。然后系统通过得知整张地图四角的坐标,计算出地图每个像素点所对应的坐标。最后根据读取的gps信息,找到对应的地图,并显示到lcd上。 开始 读取地图的基本信息根据当前gps信息找到对应的地图并显示 N 地图按键按下 Y 修改显示的地图 结束图 map 类流程图Fig.3.5 map class Flowchart 3.6 gps_diver类gps_diver类负责驱动gps模块,gps驱动原理如下所述: 。L1为民用频率,L2为军用。民用GPS信号调试成C/A码发送,C/A码又被称为粗捕获码,是1MHz的伪随机噪声码(PRN码),其码长为1023位(周期为1ms)。用户机接受到C/A码后,通过gps接受器,解调为发送次C/A码的卫星时间。并通过多个卫星发送的C/A码时间差(至少3个),来确定当前位置。并以串口的形式把经纬度数据发送给上位机。 开始 设置串口属性,访问gps模块设置gps时钟 驱动gps模块计算经纬度坐标值结束图3.6 gps_driver类流程图Fig. gps_driver class Flowchart 3.7 staSNR类StaSnR类负责对检测卫星数量,并告知gps_driver类。 开始 检测卫星数量 N 卫星数量3?Y 结束图3.7 strSNR类流程图Fig.3.7 strSNR class Flowchart 3.8 debugPDF类debugPDF类负责提供调试信息,错误编号等内容。调试程序时,配合linux中gdb命令。能实现断点调试、逐步调试等功能并显示对应的错误信息。定义如下:#include #include #ifndef DEBUG_PDF_H#define DEBUG_PDF_H/=debug level for info trace bug #define debug 1#define POP3DEBUG 1#ifdef POP3DEBUG #define PDF(level, fmt, args.) if (debug = level) printf(%s:%d fmt, _PRETTY_FUNCTION_, _LINE_ , # args)#else#define PDF(level, fmt, args.) do while(0)#endif0:没有任何的显示!1:正常工作的,能显示工作运行主流程error exit fatal show it2:更进一显示信息3:完全跟踪!3.9 Makefile文件Makefile文件为整个工程的管理文件 ,作用是连接各个头文件、c文件,最终编译成可执行文件。由于使用qt开发环境,程序可以在x86平台上与arm平台上分别运行。只需要修改Makefile文件中的编译期即可。3.10 地图文件(mapinfo.txt 文件)地图文件由一大张成都市区地图分割成许多小地图。Map.cfg文件里包含了整张地图信息。mapinfo:103.831787,30.687817,104.314155,30.473525,1500,1200,300。分别代表整个地图的左上角经纬度、右下角经纬度、地图像素的长度、地图像素的宽度、每张地图的像素宽度。软件通过读取map.cfg的内容,来获取地图的基本信息。地图软件获取方法:采用专业地图下载软件 UMD(universal maps download),用户只需在此软件里输入想要地图的四角经纬度坐标。即可得到所需地图。保证mapinfo.txtL里的地图坐标与实际坐标一致。4 测试4.1 操作系统烧写测试安装操作系统测试的目的是搭建系统的软件环境,便于后续工作安装linux有如下步骤1. 格式化nand flash2. 安装bootloader3. 安装内核文件4. 安装文件系统如下图所示图 烧写操作系统-vivi界面Fig. Flow chart of program of cooling automatically安装好操作系统后,重启系统,将出现如下画面。 图 操作系统启动画面Figure operating system to start screen系统烧写成功4.2 卫星接收测试卫星接收测试的目的是检测接收到卫星的数量,以便在接收到相同卫星的情况下,检测gps信号。测试位置:四川省成都市。第一次测试:位置室内 卫星数量 0 如下图: 图 第一次卫星接收测试Figure 4.2.1 The first test satellite reception第二次测试:位置室外空旷地带 卫星数量 7 如下图: 图 第二次卫星接收测试Figure 4.2.2 The second test satellite reception第三次测试:位置街道 卫星数量 6 如下图:图 第三次卫星接收测试Figure 4.2.2 The third test satellite reception经测试,在室内不能接收到卫星的gps信号。故此系统只能在户外使用。4.3 地图显示测试地图显示测试的目的是测试载入地图的正误、验证地图上下左右移动的功能。第一次测试: 能实现上下左右移动,显示地图如下图: 图 第一次地图显示测试 Figure The first map shows test第二次测试:能实现上下左右移动,显示地图如下图: 图 第二次地图显示测试 Figure 4.3.2 The second map shows test第三次测试:能实现上下左右移动,显示地图如下图: 图 第三次地图显示测试 Figure 4.3.3 The third map shows test经测试地图能准确的载入,并能实现上下左右移动的功能4.4 gps信号检测测试 Gps信号测试的目的是测试gps信号的精确度,测试数据列于表3中。表3 gps数据测量表测试次数(次)第一次第二次第三次显示经纬度北纬: 106.09684 实际经纬度北纬:106.080235 北纬:106.09851 误差计算 0.013 0.012 0.0011%从上表可以看出,gps数据精确度较高,误差都在0.01%左右4.5 功耗测试测试环境:户外系统使用硬件:gps模块、sd卡、液晶屏测试次数(次)第一次第二次第三次电流 300毫安 350 毫安 320毫安电压功耗从上表可看出,系统功耗在1w左右。能满足设计技术指标。4.6 其他测试1)地图路径变更测试 。 功能实现,测试通过2)gps串口波特率设置。 功能实现,测试通过 4.7 测试结果分析由以上的测试数据可以看出:本GPS导航系统能很好地实现题目要求的各项功能。测试期间运行稳定,基本达到了设计要求。5 总结本系统成功的模拟了个人手持gps导航系统。用户通过点击触摸屏幕、方便的使用软件。实现了地图的显示、拖动;gps信息、卫星数量的显示;地图路径的更改;gps波特率的更改的功能。系统低功耗、高处理速度、操作简易、界面有好。已具有一定的实用价值。通过这次毕业设计,我在更加牢固、灵活地掌握了所学的专业知识的同时。大量学习了嵌入式方面的相关知识:arm体系结构、操作系统、c+编程、shell编程、硬件驱动程序。参考文献:1 杜春雷 ARM体系结构与编程 清华大学出版社 2003-08-12 2 c+语言程序设计(第三版) 郑莉 董渊 张瑞丰 编著 清华大学出版社 2001-10-113 嵌入式系统开发 齐宇 徐俊 编著 人民邮电出版社 2005-06-054 美Douglas Boling 嵌入式linux编程 北京科彦科技发展公司 译 北京大学出版社 2003-03-125 张洪斌 QT编程指南 电子科技大学出版社 2006-06-126 李先力 文苍茂 GPS原理及应用清华大小而出版社 2004-08-278 李新峰 何广生 赵秀文 基于ARM9的嵌入式Linux开发技术 电子工业出版社2003-03-189Thomas L.Floyd.Electronic Devices M. Prentice-Hall Inc, New jersey 1999-05-19致谢至此,我的毕业设计已经基本完成。回想过去的点点滴滴,如果没有学校、学院、老师、同学的关心和帮助,我也无法按期完成这令我满意的作品。在此,我首先感谢学校和学院为我提供优越的实验场所和器材,使我能够更加方便、顺利地进行作品设计与调试,减少了设计周期;其次,我要感谢指导老师周国运老师在百忙之中抽出时间同我一起探讨系统构架和软件的编写,并不厌其烦地替我修改论文,给我了莫大的帮助,并使我学到了很多东西。周老师严谨负责的治学态度,给我留下了深刻的印象,将使我终身受益。我再次对周老师这一年多来对我的关心和帮助表示最诚挚的谢意;最后,向在整个设计过程中关心和帮助过我的其他老师和同学致谢。附录:附录1:测试仪器表7 测试仪器设备清单序号型号、名称用途数量1PC机编译程序12UT33D 数字万用表测量各电路工作情况13Gps导航仪测试显示的gps正误14vm虚拟机测试操作系统15成都、南充市区地图测试显示地图正误26精密电流、电压表测试系统功耗2附录2:部分参考源程序Maintab 类程序:#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /=#include MainWidget.h#include zhMap.h#include gps_driver.h#include maintab.h#include GPS.hMainTab:MainTab(QWidget *parent,const char * name):QTabWidget(parent,name)GpMainLayout=new MainLayout;GpGPS=new GPS;GpConfig=new Config;GpConfig-GetObject(GpMainLayout);GpConfig-GetObject(GpGPS);GpConfig-setCOMBDRate();GpConfig-setMapPath();addTab(GpMainLayout,QString(MAP);addTab(GpGPS,QString(GPS INFO);addTab(GpConfig,QString(CONFIG);timerid=startTimer(1000);void MainTab:timerEvent(QTimerEvent * event)GPS_DATA mGPSData;int i;PDF(3,TABMaster timer alarm!n);/=设置好卫星信号强度数据!GpGPS-mpSatSNR-SetData(GpMainLayout-pzhDrawRect-pGpsdriver-mGPSStaSNR);/=GpMainLayout-pzhDrawRect-pGpsdriver-GetData(mGPSData);GpGPS-mpGPSinfo-SetData(mGPSData);/=PDF(3,TABMaster timer endn);int main(int argc, char* argv) QApplication app(argc,argv);MainTab t;app.setMainWidget(&t);t.show();return app.exec();Gps_driver 类程序:#include #include gps_driver.h#include #include #include #include /*NMEA 0183 的 Checksum 只能作8位异或包括,的运算,但不包括$ 及 * 定义符号的运算。 最后的两位是检验码的hex(16进制)转成ASCII 两个符号 (0-9, A-F)。*/char nmea_checksum(char *sentence)/* is the checksum on the specified sentence good? */unsigned char sum = 0;char c, *p = sentence,csum2; c = *p; while (c != *) sum = c;p+;c=*p; /= csum0=sum&0x0f; if(csum0=10) csum0+=A; else csum0+=0;/= csum1=(sum&0xf0)4; if(csum1=10) csum1+=A; else csum1+=0;c= (csum1=toupper(p1) & csum0=toupper(p2) );return c;/ 0 is error int zh_gpsDriver:fifoctl(FifoType * priv ,int data ,const unsigned char flag)int temp = -1;unsigned int widx = 0; widx = priv-w_idx; /* Save the old index before proceeding */ if (flag = WR) /write data /* Save it to buffer */ if (priv-w_idx + 1) % BUFSIZE) = priv-r_idx) /* Adjust read index since buffer is full */ /* 无法写入来处理fifo满。can wd to fifo */ /priv-r_idx = (priv-r_idx + 1) % BUFSIZE;/保证是环状的FIFO。 PDF(2,buffer fulln);return -1; priv-bufferpriv-w_idx = data; priv-w_idx = (priv-w_idx + 1) % BUFSIZE;/保证是环状的FIFO。 return 0; else /read data if (priv-r_idx = widx) PDF(2, buffer emptyn);return -1; else temp= priv-bufferpriv-r_idx; priv-r_idx = (priv-r_idx + 1) % BUFSIZE;/保证是环状的FIFO。return temp; PDF(2, flag errorn);return -1;zh_gpsDriver:zh_gpsDriver(QObject * parent,const char * name):QObject(parent,name)COM_PARAM mCOMParam;mCOMParam.SerialDevicePath=/dev/ttyUSB0;mCOMParam.BaudRate=9600;id=startTimer(200);buf.pos=0;buf.sw=0;mpGPS_GPRMC=&mGPS_GPRMC;mpGPS_GPRMC-gps_sw=V;mpGPS_GPGSV=&mGPS_GPGSV;PDF(1,gps driver construct!n);/* Open modem device for reading and writing and not as controlling * tty. | O_NONBLOCK*/fd=-1;setCOM(mCOMParam);int zh_gpsDriver:GPRS_GetTextLineFromFIFO( CMD_BUF * pcmd_buf) / 去掉换行符 int j=0;int idata;do idata=fifoctl(&fifo,idata,RD);if(idata=-1) return 0;else if(idata=n) pcmd_buf-bufpcmd_buf-pos=(char)(idata&0x00ff);pcmd_buf-pos+;pcmd_buf-sw=1;break;elsepcmd_buf-bufpcmd_buf-pos=idata;pcmd_buf-pos+;while(j+pos)(BUFSIZE-5) PDF(2,potential fiflo overflow!n);CMDBUF_Init(pcmd_buf);PDF(2,pos=%dn,pcmd_buf-pos);pcmd_buf-bufpcmd_buf-pos=0;/PDF(4,pos=%d ibufpos=%d a msg=%sn,pos,ibufpos,pStrBuffer); return 1;int zh_gpsDriver:zh_getGPSdata(GPS_DATA & gpsdata)PDF(3,zh_getGPSdata!n);gpsdata.lati=mpGPS_GPRMC-latitude;gpsdata.lont=mpGPS_GPRMC-longitude ;return mpGPS_GPRMC-gps_sw;double ddmm2dddd(double ddmm)double fi,ffz,ffx;int fz;fi=ddmm;fz=(int)fi; ffz=(double)fz;/取整数部分ffx=fi-ffz;/取小数部分fi=ffz+ffx/0.6; PDF(2,ddmm=%lf dddd:%lfn ,ddmm,fi ); return fi; int zh_gpsDriver:GPGSV_Analysis( GPS_GPGSV * pGPS_GPGSV)switch(pGPS_GPGSV-GSV_ID)case 1:memcpy(&(mGPSStaSNR.Sta0),&(pGPS_GPGSV-Sta1),sizeof(STA_INFO);memcpy(&(mGPSStaSNR.Sta1),&(pGPS_GPGSV-Sta2),sizeof(STA_INFO);memcpy(&(mGPSStaSNR.Sta2),&(pGPS_GPGSV-Sta3),sizeof(STA_INFO);memcpy(&(mGPSStaSNR.Sta3),&(pGPS_GPGSV-Sta4),sizeof(STA_INFO);break;case 2:memcpy(&(mGPSStaSNR.Sta4),&(pGPS_GPGSV-Sta1),sizeof(STA_INFO);memcpy(&(mGPSStaSNR.Sta5),&(pGPS_GPGSV-Sta2),sizeof(STA_INFO);memcpy(&(mGPSStaSNR.Sta6),&(pGPS_GPGSV-Sta3),sizeof(STA_INFO);memcpy(&(mGPSStaSNR.Sta7),&(pGPS_GPGSV-Sta4),sizeof(STA_INFO);break;case 3:memcpy(&(mGPSStaSNR.Sta8),&(pGPS_GPGSV-Sta1),sizeof(STA_INFO);memcpy(&(mGPSStaSNR.Sta9),&(pGPS_GPGSV-Sta2),sizeof(STA_INFO);memcpy(&(mGPSStaSNR.Sta10),&(pGPS_GPGSV-Sta3),sizeof(STA_INFO);memcpy(&(mGPSStaSNR.Sta11),&(pGPS_GPGSV-Sta4),sizeof(STA_INFO);break;default:break;int zh_gpsDriver:CMD_Analysis( CMD_BUF * pcmd_buf )char* pcmd;int i;if( pcmd_buf-sw =1) PDF(3,sentence: %sn endn,pcmd_buf-buf);pcmd=strstr(&pcmd_buf-buf0,$GPRMC);/只对此语句解析if (pcmd!=NULL) if (!nmea_checksum(&pcmd1) PDF(2,check sum errorn);/*CMDBUF_Init(&buf); return 1;*/ /2:判断有效性。i= sscanf(pcmd,%*AV%c,&mpGPS_GPRMC-gps_sw);PDF(3,gpsSwFiled=%cn,mpGPS_GPRMC-gps_sw);if(mpGPS_GPRMC-gps_sw=V) PDF(3,V invalid datan); CMDBUF_Init(&buf); return 2; /sscanf 并不能由空值来输入浮点数。 / printf(Gpsid=%sn utc_time=%sn gps_sw=%cn latitude=%lfn lati_ns=%cn longitude=%lfn longi_ew=%cn spd=%lf,/Gpsid,utc_time,gps_sw,latitude, lati_ns,longitude,longi_ew,spd); i= sscanf(pcmd,%,%,%c,%lf,%c,%lf,%c,%lf,%lf,%,%lf,%c,%s,mpGPS_GPRMC-Gpsid, mpGPS_GPRMC-utc_time,&mpGPS_GPRMC-gps_sw, &mpGPS_GPRMC-latitude,&mpGPS_GPRMC-lati_ns, &mpGPS_GPRMC-longitude,&mpGPS_GPRMC-longi_ew,/*7*/&mpGPS_GPRMC-speed,&mpGPS_GPRMC-angle,mpGPS_GPRMC-utc_date,&mpGPS_GPRMC-magneDeclinat,&mpGPS_GPRMC-magneDeclinatAngle,mpGPS_GPRMC-sumCheck);/请检查 sscanf 的返回值,可能会失败,如果小于要收得的数目。if(igps_sw=V; CMDBUF_Init(&buf);return 3;/转换成度制,而不是度,分,十进制分形式。mpGPS_GPRMC-latitude=ddmm2dddd(mpGPS_GPRMC-latitude/100);mpGPS_GPRMC-longitude=ddmm2dddd(mpGPS_GPRMC-longitude/100);PDF(3,gps_sw=%cn latitude=%lfn lati_ns=%cn, mpGPS_GPRMC-gps_sw,mpGPS_GPRMC-latitude, mpGPS_GPRMC-lati_ns);PDF(3,longitude=%lfn longi_ew=%cn, mpGPS_GPRMC-longitude,mpGPS_GPRMC-longi_ew);goto out;/=pcmd=strstr(&pcmd_buf-buf0,$GPGSV);/只对此语句解析if (pcmd!=NULL) if (!nmea_checksum(&pcmd1) PDF(2,check sum errorn);/*CMDBUF_Init(&buf); return 1;*/sscanf 并不能由空值来输入浮点数。i= sscanf(pcmd,%,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%s,mpGPS_GPGSV-GPGSV, &mpGPS_GPGSV-GSV_NOB,&mpGPS_GPGSV-GSV_ID, &mpGPS_GPGSV-StaNOB,&mpGPS_GPGSV-Sta1.StaID,&mpGPS_GPGSV-Sta1.StaA,&mpGPS_GPGSV-Sta1.StaB,&mpGPS_GPGSV-Sta1.StaSNR,&mpGPS_GPGSV-Sta2.StaID,&mpGPS_GPGSV-Sta2.StaA,&mpGPS_GPGSV-Sta2.StaB,&mpGPS_GPGSV-Sta2.StaSNR,&mpGPS_GPGSV-Sta3.StaID,&mpGPS_GPGSV-Sta3.StaA,&mpGPS_GPGSV-Sta3.StaB,&mpGPS_GPGSV-Sta3.StaSNR,&mpGPS_GPGSV-Sta4.StaID,&mpGPS_GPGSV-Sta4.StaA,&mpGPS_GPGSV-Sta4.StaB,&mpGPS_GPGSV-Sta4.StaSNR,mpGPS_GPGSV-sumCheck);/请检查 sscanf 的返回值,可能会失败,如果小于要收得的数目。GPGSV_Analysis(mpGPS_GPGSV);/存入数据中!i+; goto out;out:CMDBUF_Init(&buf);return 0;voidzh_gpsDriver:CMDBUF_Init( CMD_BUF * pcmd_buf )pcmd_buf-pos=0;pcmd_buf-sw=0; intzh_gpsDriver:GetData(GPS_DATA &GPSData)PDF(3,zh_getGPSdata!n);GPSData.
展开阅读全文