做了一个GPS模块的应用程序
板子是fl2440。。arm9+linux。。Linux3.0内核。。
强调的一点是。。GPS模块要放到窗子边。。要不接收不到信号。。如果放到窗子边上。。开始可能也没有信号。。等一会再看
先给出microcomputer操作的命令。。
microcom -s 4800 dev/ttyS1
我这里模块串口是ttyS1。。模块波特率是4800
在开发板上输入上面的命令后。。会乱序显示以$GPGGA,$GPRMC,$GPGSA开头的数据行。。这里的
GGA位置测定系统定位资料(Global Positioning System Fix Data)
GSV 导航卫星资料(GNSS Satellites in View)
RMC导航卫星特定精简资料(Recommended Minimum Specific GNSS Data)
我们主要关心的是$GPGGA这行
对于这条代码的解释我参照的是“Rain”微博http://www.cnblogs.com/cpcpc/archive/2010/06/28/2123120.html。。非常感谢他的博客
要了解的都介绍完了。。下面给出我们的代码。。
#include<termios.h> //头文件
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include <string.h>
void serial_init(int fd) //一个初始化串口的函数
{
struct termios options;
tcgetattr(fd, &options);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~CSIZE;
options.c_cflag &= ~CRTSCTS;
options.c_cflag |= CS8;
options.c_cflag &= ~CSTOPB;
options.c_iflag |= IGNPAR;
options.c_oflag = 0;
options.c_lflag = 0;
cfsetispeed(&options, B4800); //注意这里是4800
cfsetospeed(&options, B4800);
tcsetattr(fd, TCSANOW, &options);
}
int main(int argc, char **argv) //主函数
{
int fd, nQ, ret, nread;
int buf = 512;
char BUF[buf]; //定义了一个BUF。。存放串口返回的数据。。要定义的足够大。。基本都是200左右。。有时会到达300+近400
char cX, cY, cH;
float fX, fY, fH;
bzero(BUF,buf); //初始化BUF
fd = open("/dev/ttyS1", O_RDWR|O_NOCTTY|O_NDELAY);//打开节点
if(fd<0) //出错返回
{
perror("Can't open ttyS1!\n");
}
serial_init(fd); //初始化串口
while(1)
{
if(read(fd, BUF, sizeof(BUF))>1) //读数据到BUF。。并判断read操作是否正确。。如果read错误则清空BUF进入下一次循环
{
if ((strstr(BUF, "$GPGGA"))!= NULL) //查找BUF中是否有$GPGGA字符串。。并返回这个字符串的起始地址。。如果没查找到返回NULL则清空BUF进入下一次循环
{
ret=sscanf(BUF,"$GPGGA,%*f,%f,%c,%f,%c,%d,%*d,%*f,%f,%c",&fX, &cX, &fY, &cY, &nQ, &fH, &cH); //提取$GPGGA中的相关数值
if(ret==7&&(nQ==1||nQ==2)) //若提取出的数值为7个。。且其中的nQ位是有GPS工作。。则打印输出。。否则清空BUF进入下一次循环
printf("cX:fX=%c:%f,cY:fY=%c:%f,fH=%f(%c)\n",cX,fX,cY,fY,fH,cH);//从左到右打印的格式是。。维度位置。。维度。。经度位置。。经度。。海拔。。海拔单位
}
bzero(BUF, buf); //清空BUF
}
sleep(1);
}
close (fd); //关闭文件描述符
return 0;
}
主要用到的两个函数是strstr和sscanf。。有疑问可以百度这两个函数的用法
因为有很多判断。。有一项不正确都不会输出结果。。所以可能的话尽量先用microcom命令测试。。如果可以正确打印信息在使用这个应用程序