//#####################gps.c############################
#include<sys/types.h>
#include<sys/stat.h>
#include<stdio.h>
#include<stdlib.h>
#include<termios.h>
#include<fcntl.h>
int quart(int fp);  
main()
{
  int j,fp;
  int max=50;
  unsigned long tmp;
  double tt;
  unsigned char ch[512];
  unsigned char cc[32];
  struct termios opt;
  fp=open("/dev/ttyS0",O_RDWR);//以读写方式打开串口1
//设置串口:波特率9600,8位数据位,奇校验、1位停止位
  tcgetattr(fp,&opt);
  tcflush(fp,TCIOFLUSH); 
  cfsetispeed(&opt,B9600);
  cfsetospeed(&opt,B9600);
  opt.c_iflag=1;
  opt.c_oflag=0;
  opt.c_cflag=3261;
  opt.c_lflag=0;
  opt.c_line=' ';
  tcsetattr(fp,TCSANOW,&opt);
  tcflush(fp,TCIOFLUSH);   
 while(!quart(fp));     //等待帧标志: @@Ha
 printf("ok!\n");
 for(j=0;j<max;j++)  //*******读gps M12数据直到收到max个数据*******
  {
   read(fp,cc,1);
   ch[j]=cc[0];
   printf("%x",ch[j]);
  }
  printf("\n");
  ////////////////////////////日期时间////////////////////////
  printf("month,day,year:%d,%d,%d\n",ch[0],ch[1],ch[2]*256+ch[3]);
  printf("hour,minute,sencond:%d,%d,%d\n",ch[4]+8,ch[5],ch[6]); 
  ///////////////////纬度///////////////////////////////////////
//  tmp=ch[27]*256*256*256+ch[28]*256*256+ch[29]*256+ch[30];
    tmp=ch[11]*256*256*256+ch[12]*256*256+ch[13]*256+ch[14]; 
  printf("latitude:%8.3f\n",tmp/324000000.0*90);
    tt=tmp/324000000.0*90;
 ///////////////////经度//////////////////////////////////////
//  tmp=ch[31]*256*256*256+ch[32]*256*256+ch[33]*256+ch[34];
  tmp=ch[15]*256*256*256+ch[16]*256*256+ch[17]*256+ch[18];
  printf("longitude:%8.3f\n",tmp/648000000.0*180);
FILE *ff;
  struct gps
   {  int day;
      int month;
      int year;
      int hour;
      int min;
      int sec;
      double wd;
      double jd;}gps;
  gps.day=ch[1];
  gps.month=ch[0];
  gps.year=ch[2]*256+ch[3];
  gps.hour=ch[4]+8;
  gps.min=ch[5];
  gps.sec=ch[6];
  gps.wd=tt;
  gps.jd=tmp/648000000.0*180;
ff=fopen("a1.txt","a+");
fprintf(ff,"\t%d  %d, %d\n",gps.day,gps.month,gps.year);
fprintf(ff,"\t%d:%d:%d\n",gps.hour,gps.min,gps.sec);
fprintf(ff,"\t%f\n",gps.wd);
fprintf(ff,"\t%f\n\n",gps.jd);
 fclose(ff);
}//main
//####################################################
int quart(int fp)  //fp是IO口句柄,如果收到@@Ha标志,返回1,否则0; 
{ int status=0;
char cc[8],tmp;
    read(fp,cc,1);
      tmp=cc[0];
    if(tmp=='@')
    {
        read(fp,cc,1);
        tmp=cc[0];
      if(tmp=='@')
      { 
           read(fp,cc,1);
           tmp=cc[0];
        if(tmp=='H')
              { 
                read(fp,cc,1);
            tmp=cc[0];
                if(tmp=='a') status=1;
              }
           }
}
return status;
 
评论