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

📄 kkk.c

📁 linux下select方式接受并解析NMEA协议gps信息
💻 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 + -