⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gps.c

📁 串口程序 embedded linux C program
💻 C
字号:
#include<sys/types.h> 
#include<sys/signal.h> 
#include<sys/siginfo.h> 
#include<termios.h> 
#include<stdio.h> 
#include<unistd.h> 
#include<sys/ioctl.h> 
#include<sys/file.h> 
#include<sys/termios.h> 
#include<fcntl.h> 
#include<time.h>  
#include<sys/time.h> 
#include<math.h> 
#include <string.h> 
#include <stdlib.h> 
#define BAUDRATE B4800 
#define MODEMDEVICE"/dev/tty01" 
 /**局部常量**/ 
FILE *freqFile; 
#define FALSE 0 
#define TRUE 1 
char write_export[50]; 
char get_export[30]; 
int MaxSlew; /*最大调节量为500000微秒*/ 

/*局部变量*/ 
int fd,res,i,flags,lined; 

int count; 
short int STOP=FALSE; 
short int WAIT=FALSE; 
int ReviseTimer;/*两次校正时间间的秒数*/ 
int Adjuster;/*间隔多少秒校正一次时间*/ 
int TimeSlew1;/*上次调节时间差毫秒*/ 
int TimeSlew2;/*本次调节时间差毫秒*/  
int SecGap;/*GPS与本地时间差秒*/ 
int uSecGap;  /*GPS与本地时间差毫秒*/ 
char buf[255]; 
int Year,Month,Day,Houth,Min,Sec; 
int RecvError;  
char ch[3]; 

char chone; 
char freq[6]; 
float frequency; 
int one; 
const time_t tm_set; 

struct tm bktime; 
struct timeval TimeSet; 
struct timeval TimeLocal;   
time_t SetTimeVal; 

/*函数说明*/ 
void TP_Init();/*初始化端口函数,TP----Time Protocol*/ 
void Recv();/*从端口中读取数据*/ 
void DataDispose(); 

short int SetAdjum; 
/*主函数*/ 

void main() 
{ 
 /*内部变量*/ 
 /*初始化一些变量*/ 
  ReviseTimer=299; 
  Adjuster=300;/*5分钟调节一次时间*/ 
  TimeSlew1=0; 
  TimeSlew2=0; 
count=41; 
  MaxSlew=50000; 
  RecvError=TRUE; 
  /*初始化端口*/ 
  
   
  TP_Init(); 
  printf( "After TP_Init \n"); 
  while(STOP==FALSE) 
  { 
  
          Recv(); 
   
 /*如果是头一次或与上一次间隔有5分钟时进行时间调节*/ 
  
       DataDispose(); 

  continue; 
  
  if(ReviseTimer>=4) 
  { 
               ReviseTimer=0; 
       DataDispose(); 
  } 
      
  gettimeofday(&TimeLocal,NULL); 
//   printf("%s\n%s,,,%d\n",buf,ctime(&TimeLocal.tv_sec),TimeLocal.tv_usec); 
      
  
   } 
  
  close(fd); 
   
} 


void TP_Init() 
{ 
  struct termios newtio;  

  fd=open(MODEMDEVICE,O_RDWR); 
  if(fd<0) 
  { 
    perror(MODEMDEVICE); 
    exit(-1); 
  } 

  isatty(fd); 
  tcgetattr(fd,&newtio); 
  bzero((void *) &newtio,sizeof(newtio)); 
  flags=fcntl(fd,F_GETFL,0); 
  newtio.c_cflag=CS8|CRTSCTS|CREAD|CLOCAL; 
  newtio.c_iflag=IXON|IXOFF; 
  newtio.c_oflag=0; 
  newtio.c_lflag=0; 
  newtio.c_cc[VTIME]=0; 
  newtio.c_cc[VMIN]=42; 
  cfsetispeed(&newtio,BAUDRATE);/*设置输入波特率*/ 
  cfsetospeed(&newtio,BAUDRATE);/*设置输出波特率*/ 
  tcflush(fd,TCIOFLUSH); 
  tcsetattr(fd,TCSANOW,&newtio); 
} 

void Recv() 
{ 
        int i; 

memset( buf, 0, sizeof( buf)); 
        read(fd,buf,43); 
printf( "\n%s", buf); 

ReviseTimer=ReviseTimer+1; 
if((buf[0]=='B')&&(buf[1]=='J')&&(buf[2]=='T')&&(buf[3]==',')) 
{ 
   RecvError=FALSE; 
   printf("asdddddddddddddddd\n"); 
     
} 
 if((buf[0]!='B')||(buf[1]!='J')||(buf[2]!='T')||(buf[3]!=',')) 
{ 
      
     
            RecvError=TRUE; 
            WAIT=FALSE; 
            while(WAIT==FALSE) 
            {  

              one=read(fd,&chone,1); 
              if((one>0)&(chone=='B')) 
              { 
                 buf[0]=chone; 
                 for( i=0;i<count-1 
                 {  
                   one=read(fd,&chone,1); 
                   if(one>0){ 
                     buf[i+1]=chone; 
                    i=i+1; 
                   } 
               }  
               WAIT=TRUE;              
            } 
          } 
                     
         }  
  
} 

/* 
*把从串口读来的字符串转换成数字年月日分秒 
*并且与本地时间相比得出一个时间差 
*/ 

void DataDispose() 
{ 
/*把从串口读来的字符串转换成数字年月日分秒*/ 
if(buf[12]==','){ 
   ch[0]=buf[6]; 
   ch[1]=buf[7]; 
   Year=atoi(ch)+2000; 

   ch[0]=buf[8]; 
   ch[1]=buf[9]; 
   Month=atoi(ch); 

   ch[0]=buf[10]; 
   ch[1]=buf[11]; 
   Day=atoi(ch); 

   ch[0]=buf[13]; 
   ch[1]=buf[14]; 
   Houth=atoi(ch); 

   ch[0]=buf[15]; 
   ch[1]=buf[16]; 
   Min=atoi(ch); 

   ch[0]=buf[17]; 
   ch[1]=buf[18]; 
   Sec=atoi(ch); 

   freq[0]=buf[36]; 
   freq[1]=buf[37]; 
   freq[2]=buf[38]; 
   freq[3]=buf[39]; 
   freq[4]=buf[40]; 
   freq[5]=buf[41]; 
   frequency=atof(freq); 

   count=42;                     

     printf( "\n %d 20%c%c/%c%c/%c%c %c%c:%c%c:%c%c \n", __LINE__, 
   buf[6], buf[7], buf[8], buf[9], buf[10], buf[11],  
   buf[13], buf[14], buf[15], buf[16], buf[17], buf[18]); 

   printf( " %d %d/%d/%d %d:%d:%d \n", __LINE__, 
   Year, Month, Day, Houth, Min, Sec); 
       
} 
       
else 
       
{ 
       
   ch[0]=buf[3]; 
   ch[1]=buf[4]; 
   Year=atoi(ch)+2000; 

   ch[0]=buf[5]; 
   ch[1]=buf[6]; 
   Month=atoi(ch); 

   ch[0]=buf[7]; 
   ch[1]=buf[8]; 
   Day=atoi(ch); 

   ch[0]=buf[10]; 
   ch[1]=buf[11]; 
   Houth=atoi(ch); 

   ch[0]=buf[13]; 
   ch[1]=buf[14]; 
   Min=atoi(ch); 

   ch[0]=buf[15]; 
   ch[1]=buf[16]; 
   Sec=atoi(ch); 

           freq[0]=buf[34]; 
   freq[1]=buf[35]; 
   freq[2]=buf[36]; 
   freq[3]=buf[37]; 
   freq[4]=buf[38]; 
   freq[5]=buf[39];count=40; 

   frequency=atof(freq);         
       
} 
     
     
  freqFile=fopen("/proj/data/Freq.dat","w"); 
        if((frequency>3&&(frequency<60)){ 
           
       
  fprintf(freqFile,"%6.4f",frequency); 
        
   } 
        
   fclose(freqFile); 
       
   /*转换为系统时间格式*/     
   bktime.tm_sec=Sec; 
   bktime.tm_min=Min; 
   bktime.tm_hour=Houth; 
   bktime.tm_mday=Day; 
   bktime.tm_mon=Month-1; 
   bktime.tm_year=Year-1900; 
   TimeSet.tv_sec=mktime(&bktime); 
           TimeSet.tv_usec=0;  

         settimeofday(&TimeSet,NULL); 
  

   return ; 

   gettimeofday(&TimeLocal,NULL); 
   /**********比较时间的大小*****************/ 
   SecGap=TimeLocal.tv_sec-TimeSet.tv_sec; 
     
    printf("\n%d,,,%s,%d,...%6.4f\n",TimeLocal.tv_sec,ctime(&TimeLocal.tv_sec), SecGap,frequency); 
        
           
   if(SecGap>=2) 
      SecGap=2; 
   if(SecGap<=-2) 
      SecGap=-2; 
   uSecGap=SecGap*1000000+TimeLocal.tv_usec; 
           TimeSlew1=(int)((uSecGap+TimeSlew2)/2); 
           
         if((uSecGap>-1000)&&(uSecGap<1000)&&(SetAdjum<100)) 
           { 
                 MaxSlew=5000; 
         SetAdjum=100; 
         } 
   else if((uSecGap>-1000)&&(uSecGap<1000)&&(SetAdjum>=100)&&(SetAdjum<1000)) 
             SetAdjum=SetAdjum+1; 
   if((uSecGap<-2000)&&(uSecGap>2000)&&(SetAdjum>100))     
              SetAdjum=100; 
           if((uSecGap<-2000)&&(uSecGap>2000)&&(SetAdjum<100)&&(SetAdjum>10))     
               SetAdjum=SetAdjum-1; 
   if((SetAdjum<95)&&(SetAdjum>10)&&(uSecGap<-2000)&&(uSecGap>2000)) 
   { 
           SetAdjum=0; 
          MaxSlew=50000; 
   } 
   if(SetAdjum>105){ 
        SetAdjum=110; 
        MaxSlew=500; 
        }         
   /*如果说本机时间比读取GPS的大,说明要使本机时间性慢一点*/ 
   if(TimeSlew1>=0) 
   { 
   if((TimeSlew1>MaxSlew)) 
   { 
   TimeSlew1=MaxSlew; 
   ReviseTimer=200;/*如果差距太大缩短调节时间间隔*/ 
   } 
                

   } 
   /*如果说本机时间比读取GPS的小,说明要使本机时间性快一点*/ 
         if(TimeSlew1<0) 
   { 
           if((TimeSlew1<-MaxSlew)) 
   { 
   TimeSlew1=-MaxSlew; 
   ReviseTimer=200;/*如果差距太大缩短调节时间间隔*/ 
   } 
                 
   } 
   TimeSlew2=TimeSlew1; 
           gettimeofday(&TimeLocal,NULL);  
           TimeLocal.tv_usec=TimeLocal.tv_usec-TimeSlew1; 
           if(TimeLocal.tv_usec>=1000000) 
           { 
              TimeLocal.tv_usec=TimeLocal.tv_usec-1000000; 
              TimeLocal.tv_sec=TimeLocal.tv_sec+1; 
            
           } 
           if(TimeLocal.tv_usec<0) 
           {  
               TimeLocal.tv_usec=TimeLocal.tv_usec+1000000; 
              TimeLocal.tv_sec=TimeLocal.tv_sec-1; 
            }  
     
         settimeofday(&TimeLocal,NULL); 
  
     
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -