zoukankan      html  css  js  c++  java
  • 从串口设置、读取、并分析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!
    ");
    		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
    ",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!
    ", DEV_NODE);
                    return -1;
            }
    
    	/*Init Uart for Um220*/
    	um220_uart_init(um220_fd,&oldtio,&newtio);
    	
    	/*Set Um220 options*/
    	printf("Please select modules of um220
    ");
    	printf("1.BD module
    ");
    	printf("2.GPS module
    ");
    	printf("3.BD+GPS module
    ");
    	if(scanf("%d",&command) != 1)
    	{
    		printf("error:input is wrong!
    ");
    	}
    	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!
    ");
    			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!
    ");
    			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!
    ");
    			break;
    		default:
    			printf("Can't identify command,set BD+GPS modules!
    ");
    			memset(msg, 0, sizeof(msg));
    			strcpy(msg,"$cfgsys,h11");
    			if(write(um220_fd,msg,sizeof(msg)) < 0)
    			printf("Failed to set BD+GPS modules!
    ");
    	}
    
    
    	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;
    }


  • 相关阅读:
    Codeforces 1255B Fridge Lockers
    Codeforces 1255A Changing Volume
    Codeforces 1255A Changing Volume
    leetcode 112. 路径总和
    leetcode 129. 求根到叶子节点数字之和
    leetcode 404. 左叶子之和
    leetcode 104. 二叉树的最大深度
    leetcode 235. 二叉搜索树的最近公共祖先
    450. Delete Node in a BST
    树的c++实现--建立一棵树
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7044456.html
Copyright © 2011-2022 走看看