5566 回复于:2003-11-05 08:20:23 |
[quote:0b00fca81b="东子"]我这里的GPS时钟原来是用串口接入的,也是Tru 64 下的系统。
但是客户说串口太慢,要该成终端服务器方式的,正好和这位的相反! 用户的要求真是千奇百怪。[/quote:0b00fca81b] 可以把你的串口程序发给我看看吗?谢谢 |
chenhao_no1 回复于:2003-11-03 12:58:55 |
1. I use DS20 Alpha Server, Tru64 4.0F
2. The protocol is like that (1)、格式1 RS-232C1、2 2脚为发送数据,3脚为接收数据,5脚为地。 波特率: 4800bit/s (出厂预置) 数据位: 8位 (ASCII码) 起始位: 1位 停止位: 1位 校验位: 无 工作方式: 异步 输出年,月,日,时,分,秒,工频钟面,钟差、周波数和外部事件产生的时刻(准确到微秒),每秒发送一次起始位与标准秒同步,误差小于0.2ms。 格式: 语句: BJT,YYYYMMDD,hhmmss,±XXXX.XX,HHFFPP,ff.f1f1f1<CR><LF> 其中: BJT表示北京时间。 YYYY为年,MM为月,DD为日,hh为时,mm为分,ss为秒。±表示钟差的符号,XXXX。XX为钟差值(标准钟-工频钟),单位为秒。HHFFPP分别为工频钟的时,分,秒。ff为周波数的两位整数部分,f1f1f1为周波数的三位小数部分。 |
chenhao_no1 回复于:2003-11-03 13:00:11 |
3. the code is that :
#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_clearcase/" target="_blank" >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); } |
5566 回复于:2003-11-03 14:42:10 |
再问大哥一个问题:用的是c编译器还是cxx编译器?
谢谢 |
东子 回复于:2003-11-04 18:59:17 |
我这里的GPS时钟原来是用串口接入的,也是Tru 64 下的系统。
但是客户说串口太慢,要该成终端服务器方式的,正好和这位的相反! 用户的要求真是千奇百怪。 |