#define GPS_RECV_CMD_MAX_BUF 256
struct termios newtio, oldtio;
int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop) { if (tcgetattr(fd, &oldtio) != 0) { perror(\"SetupSerial 1\"); return -1; }
newtio = oldtio; newtio.c_cflag &= ~CSIZE; switch(nBits) { case 7: newtio.c_cflag |= CS7; break; case 8: newtio.c_cflag |= CS8; break; } switch(nEvent) { case 'O': newtio.c_cflag |= PARENB; newtio.c_cflag |= PARODD; newtio.c_iflag |= (INPCK | ISTRIP); break; case 'E': newtio.c_iflag |= (INPCK | ISTRIP); newtio.c_cflag |= PARENB;
newtio.c_cflag &= ~PARODD; break; case 'N': newtio.c_cflag &= ~PARENB; break; }
switch(nSpeed) { case 2400: cfsetispeed(&newtio, B2400); cfsetospeed(&newtio, B2400); break; case 4800: cfsetispeed(&newtio, B4800); cfsetospeed(&newtio, B4800); break; case 9600: cfsetispeed(&newtio, B9600); cfsetospeed(&newtio, B9600); break; case 115200: cfsetispeed(&newtio, B115200); cfsetospeed(&newtio, B115200); break; default: cfsetispeed(&newtio, B9600); cfsetospeed(&newtio, B9600); break; } if(nStop == 1) newtio.c_cflag &= ~CSTOPB; else if (nStop == 2) newtio.c_cflag |= CSTOPB; newtio.c_cflag |= CLOCAL | CREAD; newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);// raw mode output, no echo. newtio.c_oflag &= ~OPOST;//turn off out control bits newtio.c_cc[VTIME] = 0; newtio.c_cc[VMIN] = 1; tcflush(fd, TCIOFLUSH);
if((tcsetattr(fd, TCSANOW, &newtio)) != 0) { perror(\"com set error\"); return -1; } printf(\"set done!\\n\"); return 0; }
int open_port(int fd,int comport) { if (comport == 1) { fd = open( \"/dev/ttyS0\ if (-1 == fd){ perror(\"Can't Open Serial Port\"); return(-1); } else printf(\"open ttyS0 .....\\n\"); } else if(comport == 2) { fd = open( \"/dev/ttyUSB0\O_RDWR | O_NOCTTY | O_NDELAY);// O_NONBLOCK if (-1 == fd){ perror(\"Can't Open Serial Port\"); return(-1); } else printf(\"open ttyS1 .....\\n\"); } else if (comport == 3) { fd = open( \"/dev/ttyS2\ if (-1 == fd){ perror(\"Can't Open Serial Port\"); return(-1); } else printf(\"open ttyS2 .....\\n\"); } if(fcntl(fd, F_SETFL, 0) < 0)//fcntl(fd, F_GETFL, 0) & ~O_NONBLOCK printf(\"fcntl failed!\\n\");
| else printf(\"fcntl=%d\\n\ if(isatty(STDIN_FILENO) == 0) printf(\"standard input is not a terminal device\\n\"); else printf(\"isatty success!\\n\"); printf(\"fd-open=%d\\n\ return fd; }
typedef struct GGAINFO { int bIsGPGGA;
unsigned char hour, bjhour, min, sec, secFrac; unsigned int latitude;//double latitude; unsigned int latMin; unsigned char latNS;
unsigned int longitude;//double longitude; unsigned int lgtMin; unsigned char lgtEW; unsigned char satellites; short altitude; } GGAINFO;
typedef struct RMCINFO { int bIsGPRMC;
unsigned char hour, bjhour, min, sec; unsigned short secFrac; unsigned char status;
unsigned int latitude;//double latitude; unsigned int latMin; unsigned char latNS;
unsigned int longitude;//double longitude; unsigned int lgtMin; unsigned char lgtEW; unsigned char dd, mm, yy; } RMCINFO;
int main(void) { int fd, res; int i, no;
fd_set fds; struct timeval tv; char buff[GPS_RECV_CMD_MAX_BUF]; GGAINFO ggainfo; //Global Positioning System Fix Data
RMCINFO rmcinfo; //Recommended Minimum Specific GPS Data char Degree[4]; char Minute[8]; char Hour[4]; char Minu[4]; char Second[4]; char Mse[4]; char Satnum[4];
char DD[2], MM[2], YY[2]; if((fd=open_port(fd, 2))<0){
perror(\"open_port error\"); return; } if((i=set_opt(fd, 9600, 8, 'N', 1))<0){ perror(\"set_opt error\"); return; } /* cfsetispeed(&newios, B9600);
cfsetospeed(&newios, B9600); tcflush(fd,TCIOFLUSH);
if((tcsetattr(fd,TCSANOW,&newios))!=0) {
perror(\"com set error\"); return -1; } FD_ZERO(&fds); FD_SET(fd,&fds); tv.tv_sec = 5; tv.tv_usec = 0; if(select(fd+1,&fds,NULL,NULL,&tv)<=0) return -1; */
FD_ZERO(&fds); while(1)
{ FD_SET(fd, &fds);
memset(buff, 0, GPS_RECV_CMD_MAX_BUF); if(select(fd+1, &fds, NULL, NULL, NULL)<=0) { printf(\"ERROR!\"); return -1; } if(FD_ISSET(fd, &fds)) { while(!Is_startGP(fd)); for(i=0; i<128; i++) { read(fd, &buff[i], 1); printf(\"%c\
if(buff[i] == '\\n') break; }
//$GPGGA,(6)04(8)47(10)02.(13)00,(16)3203.47362,N,11846.40739,E,1,09,1.55,26.4,M,2.3,M,,*55 if(Is_GGA(buff)) { ggainfo.bIsGPGGA = 1; //Time:6-15 no = 6; for(i = 0;i < 4;i++) Hour[i]=0;
Hour[0]=buff[no]; //Hour[0]=buff[6]=0 Hour[1]=buff[no+1]; //Hour[1]=buff[7]=4 no += 2; for(i = 0;i < 4;i++) Minu[i]=0;
Minu[0]=buff[no]; //Minu[0]=buff[8]=4 Minu[1]=buff[no+1]; //Minu[1]=buff[9]=7
no += 2; //n=10 for(i = 0;i < 4;i++) Second[i]=0;
Second[0]=buff[no]; Second[1]=buff[no+1];
no += 3; //n=13 // no+=4; //n=14 for(i = 0;i < 4;i++) Mse[i] = 0;
Mse[0] = buff[no]; //Mse[0] = buff[13] = 0; Mse[1] = buff[no+1]; //Mse[1] = buff[14] = 0; // Mse[2] = buff[no+2]; //Mse[2] = buff[15] = ','; no = atoi(Mse); //atoi()把字符串转化成长整型 gdb调试显示n=0; ggainfo.hour = atoi(Hour); ggainfo.min = atoi(Minu); ggainfo.sec = atoi(Second); ggainfo.secFrac = atoi(Mse); ggainfo.bjhour = ggainfo.hour + 8;
if(ggainfo.bjhour > 24) ggainfo.bjhour -= 24; printf(\"\\n\\nUTC
Time:%dh %dmin %dsec %dmsec\\n\ printf(\"BJ
Time:%dh %dmin %dsec %dmsec\\n\ no = 16; for(i = 0;i < 4;i++) Degree[i]=0;
Degree[0]=buff[no]; Degree[1]=buff[no+1];
no+=2; for(i=0;i<8;i++) Minute[i]=0;
for(i=0;i<7;i++) Minute[i]=buff[no+i];
// ggainfo.latitude=(atof(Minute)) / 60.0 + atoi(Degree); ggainfo.latitude= atoi(Degree); ggainfo.latMin=(atof(Minute)); ggainfo.latNS = buff[27];
printf(\"Latitude:%c Lat \ printf(\"%ddeg %dmin\\n\ no = 29; for(i=0;i<4;i++) Degree[i]=0;
Degree[0]=buff[no]; Degree[1]=buff[no+1]; Degree[2]=buff[no+2];
no+=3; for(i=0;i<8;i++) Minute[i]=0;
for(i=0;i<7;i++) Minute[i]=buff[no+i]; ggainfo.longitude=(atof(Minute)) / 60.0 + atoi(Degree); ggainfo.lgtMin=(atof(Minute)); ggainfo.lgtEW = buff[41];
printf(\"Longitude:%c Lgt \ printf(\"%ddeg %dmin\\n\ no = 45; for(i = 0;i < 4;i++) Satnum[i]=0;
Satnum[0]=buff[no]; Satnum[1]=buff[no+1];
ggainfo.satellites = atoi(Satnum);
printf(\"Satellites:%d \\n\
printf(\"\\n\"); } else if(Is_RMC(buff)) { rmcinfo.bIsGPRMC = 1; //Time:6-15 no = 6; for(i = 0;i < 4;i++)
//
Hour[i]=0; Hour[0]=buff[no]; Hour[1]=buff[no+1]; no += 2; for(i = 0;i < 4;i++) Minu[i]=0; Minu[0]=buff[no]; Minu[1]=buff[no+1]; no += 2; for(i = 0;i < 4;i++) Second[i]=0; Second[0]=buff[no]; Second[1]=buff[no+1]; no += 3; for(i = 0;i < 4;i++) Mse[i] = 0; Mse[0] = buff[no]; Mse[1] = buff[no+1]; Mse[2] = buff[no+2]; no = atoi(Mse); rmcinfo.hour = atoi(Hour); rmcinfo.min = atoi(Minu); rmcinfo.sec = atoi(Second); rmcinfo.secFrac = atoi(Mse); rmcinfo.bjhour = rmcinfo.hour + 8; if(rmcinfo.bjhour > 24)
rmcinfo.bjhour -= 24; printf(\"\\n\\nUTC Time:%dh %dmin %dsec %dmsec\\n\rmcinfo.hour, rmcinfo.min, rmcinfo.sec, rmcinfo.secFrac); printf(\"BJ Time:%dh %dmin %dsec %dmsec\\n\rmcinfo.sec, rmcinfo.secFrac); no = 19; for(i = 0;i < 4;i++) Degree[i]=0;
Degree[0]=buff[no]; Degree[1]=buff[no+1];
no+=2; for(i=0;i<8;i++) Minute[i]=0;
for(i=0;i<7;i++) Minute[i]=buff[no+i];
// rmcinfo.latitude=(atof(Minute)) / 60.0 + atoi(Degree); rmcinfo.latitude= atoi(Degree); rmcinfo.latMin=(atof(Minute)); rmcinfo.latNS = buff[29];
printf(\"Latitude:%c Lat \ printf(\"%ddeg %dmin\\n\ no = 31; for(i=0;i<4;i++) Degree[i]=0;
Degree[0]=buff[no]; Degree[1]=buff[no+1]; Degree[2]=buff[no+2];
no+=3; for(i=0;i<8;i++) Minute[i]=0;
for(i=0;i<7;i++) Minute[i]=buff[no+i]; rmcinfo.longitude=(atof(Minute)) / 60.0 + atoi(Degree);
rmcinfo.lgtMin=(atof(Minute)); rmcinfo.lgtEW = buff[43];
printf(\"Longitude:%c Lgt \ printf(\"%ddeg %dmin\\n\ no = 52; for(i = 0;i < 2;i++) { DD[i]=0;
MM[i]=0; YY[i]=0; }
DD[0]=buff[no]; DD[1]=buff[no+1];
MM[0]=buff[no+2]; MM[1]=buff[no+3];
YY[0]=buff[no+4]; YY[1]=buff[no+5];
rmcinfo.dd = atoi(DD); rmcinfo.mm = atoi(MM); rmcinfo.yy = atoi(YY);
printf(\"Today is 20%c%cYear /%c%cMonth /%c%cDay\\n\YY[0], YY[1], MM[0], MM[1], DD[0], DD[1]);
no = 16;
rmcinfo.status = buff[no];
if(rmcinfo.status == 'A') printf(\"Data valid!\\n\"); else
printf(\"Data invalid!\\n\"); printf(\"\\n\"); } else continue; // usleep (1000); }
}
tcsetattr(fd, TCSANOW, &oldtio); close(fd); return 0; }
int Is_GGA(char *p) {
int status=0;
if(*(p+2) == 'G' && *(p+3) == 'G' && *(p+4) == 'A') status=1; return status; }
int Is_RMC(char *p) {
int status=0;
if(*(p+2) == 'R' && *(p+3) == 'M' && *(p+4) == 'C') status=1; return status; }
int Is_startGP(int fp) {
int status=0; char cc;
read(fp,&cc,1);
if(cc == '$')status=1; return status; }
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- xiaozhentang.com 版权所有 湘ICP备2023022495号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务