从串口设置、读取、并分析um220模块的数据
转载请注明:http://blog.csdn.net/wang_zheng_kai
导航制导与控制实验室 2014年11月10日
好久没有写博客了,先从一个小小的程序開始一段新的历程吧。
近期的项目主要还是用的的是linux系统,这篇文章主要介绍怎样从设置、读取BD+gps模块(um220),实际上主要是对串口(UART)的操作。
/* * gps.c * * um220 test * * Author: Wang Zhengkai <449811900@qq.com> * */ #include <stdio.h> #include <termios.h> #include <strings.h> #include <string.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h>
/*我用的是ubuntu的电脑測试的,使用的串口是ttyS0*/ #define DEV_NODE "/dev/ttyS0" #define MAX_PACKET_SIZE 1024
</pre><pre code_snippet_id="478189" snippet_file_name="blog_20140930_2_1496439" name="code" class="objc">/************************************************
******* Initialize serial port options***********
************************************************/
static void setTermios(struct termios * pNewtio, int uBaudRate) { bzero(pNewtio, sizeof(struct termios)); /* clear struct for new port settings */ //8N1 pNewtio->c_cflag = uBaudRate | CS8 | CREAD | CLOCAL; pNewtio->c_iflag = IGNPAR; pNewtio->c_oflag = 0; pNewtio->c_lflag = 0; //non ICANON } /*************************************************
**设置um220串口的波特率9600。并刷新使其马上生效***
**************************************************/
void um220_uart_init(int ttyFd,struct termios *oldtio,struct termios *newtio) { tcgetattr(ttyFd, oldtio); /* save current serial port settings */ setTermios(newtio, B9600); tcflush(ttyFd, TCIFLUSH); tcsetattr(ttyFd, TCSANOW, newtio); } /**************************************************
*************Analysis Data of um220****************
***************************************************/ void parseData(char *buf) { int nQ, nN, nB, nC; char cX, cY, cM1, cM2; float fTime, fX, fY, fP, fH, fB, fD; if (buf == NULL) { printf("error: Can't get buf!\n"); return; } sscanf(buf,"$GNGGA,%f,%f,%c,%f,%c,%d,%02d,%f,%f,%c,%f,%c,%f,%04d%02x",&fTime,&fX,&cX,&fY,&cY,&nQ,&nN,&fP,&fH,&cM1,&fB,&cM2, &fD, &nB, &nC); printf("x: %c %f, y: %c %f, h %f, satellite: %d\n",cX, fX, cY, fY, fH, nN);
/*cX:N or S;fX:纬度;cY:E or W;fY:经度;fH:height;nN:卫星个数*/ } int main(void) { int nb,command; int um220_fd = -1; char newbuf[MAX_PACKET_SIZE]; char msg[20],*ret=NULL; struct termios oldtio, newtio; /*Open Um220 Module*/ if ((um220_fd = open(DEV_NODE, O_RDWR)) < 0) { printf("error: Can't open serial port %s!\n", DEV_NODE); return -1; } /*Init Uart for Um220*/ um220_uart_init(um220_fd,&oldtio,&newtio); /*Set Um220 options*/ printf("Please select modules of um220\n"); printf("1.BD module\n"); printf("2.GPS module\n"); printf("3.BD+GPS module\n"); if(scanf("%d",&command) != 1) { printf("error:input is wrong!\n"); } switch(command) { case 1: memset(msg, 0, sizeof(msg)); strcpy(msg,"$cfgsys,h01"); if(write(um220_fd,msg,sizeof(msg)) < 0) printf("Failed to set BD modules!\n"); break; case 2: memset(msg, 0, sizeof(msg)); strcpy(msg,"$cfgsys,h10"); if(write(um220_fd,msg,sizeof(msg)) < 0) printf("Failed to set GPS modules!\n"); break; case 3: memset(msg, 0, sizeof(msg)); strcpy(msg,"$cfgsys,h11"); if(write(um220_fd,msg,sizeof(msg)) < 0) printf("Failed to set BD+GPS modules!\n"); break; default: printf("Can't identify command,set BD+GPS modules!\n"); memset(msg, 0, sizeof(msg)); strcpy(msg,"$cfgsys,h11"); if(write(um220_fd,msg,sizeof(msg)) < 0) printf("Failed to set BD+GPS modules!\n"); } for(;;) { /*Read Data from Um220*/ memset(newbuf, 0, 1024); nb = read(um220_fd, newbuf, MAX_PACKET_SIZE); if (nb == -1) { perror("read uart error"); return -1; } if ((ret=strstr(newbuf, "$GNGGA")) != NULL) { /*Analysis Data*/ parseData(ret); } sleep(1); } /*Recover Settings Of Serial Port*/ tcsetattr(um220_fd,TCSANOW,&oldtio); /*Close Um220_fd*/ close(um220_fd);
return 0; }