📄 kkk.c
字号:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <stdlib.h>
#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", O_RDWR | O_NOCTTY | O_NDELAY);
if (-1 == fd){
perror("Can't Open Serial Port");
return(-1);
}
else
printf("open ttyS0 .....\n");
}
else if(comport == 2)
{ fd = open( "/dev/ttyS1", 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", O_RDWR | O_NOCTTY | O_NDELAY);
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", fcntl(fd, F_GETFL, 0));
if(isatty(STDIN_FILENO) == 0)
printf("standard input is not a terminal device\n");
else
printf("isatty success!\n");
printf("fd-open=%d\n", fd);
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;
RMCINFO rmcinfo;
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", buff[i]);
if(buff[i] == '\n')
break;
}
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[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);
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",ggainfo.hour,ggainfo.min,ggainfo.sec,no);
printf("BJ Time:%dh %dmin %dsec %dmsec\n",ggainfo.bjhour,ggainfo.min,ggainfo.sec,no);
no = 17;
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.latMin=(atof(Minute));
ggainfo.latNS = buff[27];
printf("Latitude:%c Lat ",ggainfo.latNS);
printf("%ddeg %dmin\n",ggainfo.latitude,ggainfo.latMin);
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[40];
printf("Longitude:%c Lgt ",ggainfo.lgtEW);
printf("%ddeg %dmin\n",ggainfo.longitude,ggainfo.lgtMin);
no = 44;
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",ggainfo.satellites);
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.bjhour, rmcinfo.min, 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.latMin=(atof(Minute));
rmcinfo.latNS = buff[29];
printf("Latitude:%c Lat ",ggainfo.latNS);
printf("%ddeg %dmin\n",ggainfo.latitude,ggainfo.latMin);
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[42];
printf("Longitude:%c Lgt ", rmcinfo.lgtEW);
printf("%ddeg %dmin\n", rmcinfo.longitude, rmcinfo.lgtMin);
no = 46;
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 %c%cyy %c%cmm %c%cdd.\n", YY[0], YY[1], MM[0], MM[1], DD[0], DD[1]);
no = 17;
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -