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

📄 mygps.c

📁 處理與接收 gps 信號的範例碼, 使用的平台式 HOLUX GR-86.
💻 C
📖 第 1 页 / 共 2 页
字号:
 *    cmd GPS command
 */
static void handle_GPRMC(char *cmd) 
{
/* ptr */
char *sptr;
/* checksum */
char chk_sum[6];

    printf("Recommended Minimum Specific GNSS Data (RMC)\n");

    /* get checksum */
    if((sptr = strrchr(cmd, '*'))){
        strcpy(chk_sum, sptr + 1);
        *sptr = '\0';
    }
    
    /* get msg id */
    mystrtok(cmd);
    
    /* get UTC Time */
    if((sptr = mystrtok(NULL))){
        printf("\tUTC Time: %s\n", sptr);  
    }

    /* get Status */
    if((sptr = mystrtok(NULL))){
        printf("\tStatus: %s, ", sptr);  
        switch(sptr[0]){
        case 'A': printf("data valid\n"); break;
        case 'V': printf("data not valid\n"); break;     
        }
    }
    
    /* get Latitude */
    if((sptr = mystrtok(NULL))){
        printf("\tLatitude: %s\n", sptr);  
    }
    
    /* get N/S Indictor */
    if((sptr = mystrtok(NULL))){
        printf("\tN/S Indictor: %s\n", sptr);  
    }
    
    /* get Longitude */
    if((sptr = mystrtok(NULL))){
        printf("\tLongitude: %s\n", sptr);  
    }
    
    /* get E/W Indictor */
    if((sptr = mystrtok(NULL))){
        printf("\tE/W Indictor: %s\n", sptr);  
    }
    
    /* get Speed Over Ground */
    if((sptr = mystrtok(NULL))){
        printf("\tSpeed Over Ground: %s\n", sptr);  
    }
    
    /* get Course Over Ground */
    if((sptr = mystrtok(NULL))){
        printf("\tCourse Over Ground: %s\n", sptr);  
    }    
    
    /* get Date */
    if((sptr = mystrtok(NULL))){
        printf("\tDate: %s\n", sptr);  
    }    

    /* get Magnetic Variation 1 */
    if((sptr = mystrtok(NULL))){
        printf("\tMagnetic Variation 1: %s\n", sptr);  
    }
    
    /* get Magnetic Variation 2 */
    if((sptr = mystrtok(NULL))){
        printf("\tMagnetic Variation 2: %s\n", sptr);  
    }

    /* get Magnetic Variation 3 */
    if((sptr = mystrtok(NULL))){
        printf("\tMagnetic Variation 3: %s\n", sptr);  
    }else{
        printf("\tMagnetic Variation 3:\n", sptr);         
    }    
    
    /* show checksum */
    printf("\tChecksum: 0x%s\n", chk_sum);   
}
//---------------------------------------------------
/**
 * @brief handle GPS VTG command
 *
 * @param 
 *    cmd GPS command
 */
static void handle_GPVTG(char *cmd) 
{
/* ptr */
char *sptr;
/* checksum */
char chk_sum[6];

    printf("Course Over Ground and Ground Speed (VTG)\n");
    
    /* get checksum */
    if((sptr = strrchr(cmd, '*'))){
        strcpy(chk_sum, sptr + 1);
        *sptr = '\0';
    }
    
    /* get msg id */
    mystrtok(cmd);
    
    /* get Course */
    if((sptr = mystrtok(NULL))){
        printf("\tCourse: %s\n", sptr);  
    }
    
    /* get Reference */
    if((sptr = mystrtok(NULL))){
        printf("\tReference: %s\n", sptr);  
    }
    
    /* get Course */
    if((sptr = mystrtok(NULL))){
        printf("\tCourse: %s\n", sptr);  
    }
    
    /* get Reference */
    if((sptr = mystrtok(NULL))){
        printf("\tReference: %s\n", sptr);  
    }

    /* get Speed */
    if((sptr = mystrtok(NULL))){
        printf("\tSpeed: %s\n", sptr);  
    }
    
    /* get Units */
    if((sptr = mystrtok(NULL))){
        printf("\tUnits: %s\n", sptr);  
    }    
   
    /* get Speed */
    if((sptr = mystrtok(NULL))){
        printf("\tSpeed: %s\n", sptr);  
    }
   
    /* get Units */
    if((sptr = mystrtok(NULL))){
        printf("\tUnits: %s\n", sptr);        
    }
    
    /* get Units */
    if((sptr = mystrtok(NULL))){
        printf("\tUnits: %s\n", sptr);        
    }else{
        printf("\tUnits:\n");         
    }
        
    /* show checksum */
    printf("\tChecksum: 0x%s\n", chk_sum);  
}
//---------------------------------------------------
/**
 * @brief handle GPS MSS command
 *
 * @param 
 *    cmd GPS command
 */
static void handle_GPMSS(char *cmd) 
{
/* ptr */
char *sptr;
/* checksum */
char chk_sum[6];

    printf("MSK Receiver Signal (MSS)\n");

    /* get checksum */
    if((sptr = strrchr(cmd, '*'))){
        strcpy(chk_sum, sptr + 1);
        *sptr = '\0';
    }
    
    /* get msg id */
    mystrtok(cmd);
    
    /* get Signal Strength */
    if((sptr = mystrtok(NULL))){
        printf("\tSignal Strength: %s\n", sptr);  
    }
    
    /* get Signal-to-Noise Ratio */
    if((sptr = mystrtok(NULL))){
        printf("\tSignal-to-Noise Ratio: %s\n", sptr);  
    }    
    
    /* get Beacon Frequency */
    if((sptr = mystrtok(NULL))){
        printf("\tBeacon Frequency: %s\n", sptr);  
    }   
    
    /* get Beacon Bit Rate */
    if((sptr = mystrtok(NULL))){
        printf("\tBeacon Bit Rate: %s\n", sptr);  
    }else{
        printf("\tBeacon Bit Rate:\n");          
    }      
    
    /* show checksum */
    printf("\tChecksum: 0x%s\n", chk_sum);                                           
}
//---------------------------------------------------
/**
 * @brief handle GPS ZDA command
 *
 * @param 
 *    cmd GPS command
 */
static void handle_GPZDA(char *cmd) 
{
/* ptr */
char *sptr;
/* checksum */
char chk_sum[6];

    printf("SiRF Timing Message (ZDA)\n");
    
    /* get checksum */
    if((sptr = strrchr(cmd, '*'))){
        strcpy(chk_sum, sptr + 1);
        *sptr = '\0';
    }  
    
    /* get msg id */
    mystrtok(cmd);
    
    /* get UTC Time */
    if((sptr = mystrtok(NULL))){
        printf("\tUTC Time: %s\n", sptr);  
    }
    
    /* get Day */
    if((sptr = mystrtok(NULL))){
        printf("\tDay: %s\n", sptr);  
    }  
    
    /* get Month */
    if((sptr = mystrtok(NULL))){
        printf("\tMonth: %s\n", sptr);  
    }  
    
    /* get Year */
    if((sptr = mystrtok(NULL))){
        printf("\tYear: %s\n", sptr);  
    } 
    
    /* get Local zone hour */
    if((sptr = mystrtok(NULL))){
        printf("\tLocal zone hour: %s\n", sptr);  
    }               
    
    /* get Local zone hour */
    if((sptr = mystrtok(NULL))){
        printf("\tLocal zone hour: %s\n", sptr);     
    }else{
        printf("\tLocal zone hour:\n");         
    }
        
    /* show checksum */
    printf("\tChecksum: 0x%s\n", chk_sum);                                              
}
//---------------------------------------------------
/**
 * @brief handle GPS command
 *
 * @param 
 *    cmd GPS command
 */
static void handle_gps_cmd(char *cmd) 
{
/* tmp */
char tmp[16];
/* ptr */
char *sptr;

    /* get tmp */
    strncpy(tmp, cmd, 16);
    
    /* get message ID */
    if((sptr = strtok(tmp, ","))){
        if(!strcmp(sptr, GPGGA_MSG)){
            handle_GPGGA(cmd); 
        }else if(!strcmp(sptr, GPGLL_MSG)){
            handle_GPGLL(cmd); 
        }else if(!strcmp(sptr, GPGSA_MSG)){
            handle_GPGSA(cmd); 
        }else if(!strcmp(sptr, GPGSV_MSG)){
            handle_GPGSV(cmd); 
        }else if(!strcmp(sptr, GPRMC_MSG)){
            handle_GPRMC(cmd); 
        }else if(!strcmp(sptr, GPMSS_MSG)){
            handle_GPMSS(cmd); 
        }else if(!strcmp(sptr, GPVTG_MSG)){
            handle_GPVTG(cmd); 
        }else if(!strcmp(sptr, GPZDA_MSG)){
            handle_GPZDA(cmd); 
        }
    }
}

//---------------------------------------------------
/**
 * @brief main function
 *
 * @param 
 *    argc the number of arguments
 * @param
 *    argv the arguments 
 */
int main(int argc, char *argv[]) 
{
/* file descriptor */
int fd0, fd1;
/* read buffer, cmd buffer */
char buf[512];
char sbuf[512];
/* read size */
int nread;
/* handle pointer */
char *nchr;
/* terminal */
struct termios termopt, saveopt;
   
    /* open GPS device */
    fd0 = open("/dev/tts/2",O_RDWR);
    if (fd0<0) {
        perror("Cannot Open Serial Port 0!\n");
    }

   
    /* save terminal environment */
    tcgetattr(fd0, &saveopt);
    tcgetattr(fd0, &termopt);
    
    /* set I/O speed, 4800 */
    cfsetispeed(&termopt, B4800);
    cfsetospeed(&termopt, B4800);

    /* set flag, and data bit */
    termopt.c_lflag &= ~(ICANON | ECHO);
    termopt.c_cflag &= ~CSIZE;
    termopt.c_cflag |= CS8;
    termopt.c_iflag = 0;
    
    /* set time, min flag */
    termopt.c_cc[VTIME] = 1;
    termopt.c_cc[VMIN] = 1;


    /* set attributed */
    if (tcsetattr(fd0, TCSAFLUSH, &termopt) < 0) {
        printf("tcsetattr fail !\n");
        exit(1);
    }

    
    /* initialize buffer, add by crilit */
    sbuf[0] = 0;
    nchr = NULL;
    
    /* get message */
    while(1){

        while( (nread = read(fd0, buf, 512)) > 0) {
            buf[nread] = '\0';

            /* copy to buffer, search CR LF, add by crilit */
            if((nchr = strstr(buf, "\r\n"))) { /* end of message */
            
                /* copy first part */
                *nchr = '\0';
                strcat(sbuf, buf);
                printf("\ncmd: %s\n", sbuf);
                handle_gps_cmd(sbuf);
                
                /* copy second part */
                nchr += 2; /* move CR, LF */ 
                strcpy(sbuf, nchr);
            }else if((nchr = strchr(buf, '\r'))){
                  
                /* only \r */
                *nchr = '\0';
                strcat(sbuf, buf);
            }else if((nchr = strchr(buf, '\n'))){
                  
                /* only \n, nothing to do, do the command */
                printf("\ncmd: %s\n", sbuf);
                handle_gps_cmd(sbuf);
                
                /* copy second part */
                nchr += 1; /* move LF */ 
                strcpy(sbuf, nchr);                
            }else{ /* not end of message */
                /* copy to buffer */
                strcat(sbuf, buf);
            }
        }

    }
}
//---------------------------------------------------

⌨️ 快捷键说明

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