📄 mygps.c
字号:
* 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 + -