预览加载中,请您耐心等待几秒...
1/7
2/7
3/7
4/7
5/7
6/7
7/7
在线预览结束,喜欢就下载吧,查找使用更方便
如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
获取GPS模块数据并规格化输出(2009-11-1813:41:37)标签:HYPERLINK"http://uni.sina.com.cn/c.php?t=blog&k=it&ts=bpost&stype=tag"\t"_blank"it分类:HYPERLINK"http://blog.sina.com.cn/s/articlelist_1044870371_9_1.html"嵌入式Linux(ARM)本次做的实验是获取GPS模块的原始数据,并对数据进行规格化处理后再输出,采用单线程方式实现,停止时需要强制中止(按CTRL+C),使用的设备是:瑞泰2410实验箱和HOLUXGR-87的GPS模块,该模块接到箱上的扩展槽上(对应COM1),整个实验过程涉及的步骤是:设置串口1的波特率等参数、读取通过COM1收到的GPS模块返回的原始数据,再进行分离MessageID为$GPRMC的项,并获取该串数据,处理后暂存到相应的数据结构中并输出。实验环境是:ARM+Linux。本程序用到的文件有main.c、gps.h、gps.c、Makefile,下面给出源码如下:main.c:#include<termios.h>#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include"gps.h"#defineBAUDRATEB9600//串口波特率,即GPS通过COM1发来的数据传输率#defineCOM1"/dev/ttyS1"//定义与GPS连接的串口1的实际位置,此位置需根据2410箱上的实际来设置GPS_INFOgps_info;//存放分离后的gps数据,是一个结构体,在gps.h中定义charGPS_BUF[1024];//存放从串口读到的GPS原始数据staticintbaud=BAUDRATE;volatileintfd;//打开串口后保存的设备描述符void*receive()//当收到一串数据时(以回车符作为分界来识别一串字符),则原样输出,当字符中第6个是C时,则表示是我们需要的数据串(以$GPRMC开头),则对该串进行分离出时间及经纬度并输出来,否则只是原样输出。{inti=0;charc;charbuf[1024];printf("readgps\n");while(1){read(fd,&c,1);//从打开的串口COM1(因为GPS模块接到了COM1)读取1个字符buf[i++]=c;if(c=='\n'){strncpy(GPS_BUF,buf,i);//从buf中复制i个字符到GPS_BUF中i=0;//重置数据的起始位置printf("%s",GPS_BUF);//原样输出if(buf[5]=='C'){gps_parse(GPS_BUF,&gps_info);//分离原始数据show_gps(&gps_info);//显示分离后的数据}}}printf("exitfromreadinggps\n");returnNULL;}intmain(){structtermiosoptions;//串口设置的结构fd=open(COM1,O_RDWR);if(fd<0){perror(COM1);exit(-1);}tcgetattr(fd,&options);options.c_cflag=baud|CRTSCTS|CS8|CLOCAL|CREAD;options.c_iflag=IGNPAR;//忽略奇偶校验options.c_oflag=0;//Raw模式输出//不处理,就原始数据输出options.c_lflag=0;//不处理,原始数据输入options.c_cc[VMIN]=1;//阻塞,直到读取到一个字符options.c_cc[VTIME]=0;//不使用字符间的计时器//清空数据线,启动新的串口设置tcflush(fd,TCIFLUSH);//刷新输入队列tcsetattr(fd,TCSANOW,&options);//新属性设置生效if(receive()==NULL)exit(-1);调用接收函数收取GPS获到的数据exit(0);}gps.h:#ifndef_GPS_H#define_GPS_Htypedefstruct{intyear;//年intmonth;//月intday;//日inthour;//时intminute;//分intsecond;//秒}date_time;//时间结构体typedefstruct{date_timeD;//时间doublelatitude;//纬度doublelongitude;//经度charNS;//南北极cha