Linux下使用USB转串口读取GPS数据

本文介绍了一个具体的串口配置及通信实例,包括如何使用C语言设置串口参数如波特率、数据位等,并展示了如何通过两个不同串口进行数据发送与接收的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<termios.h>
#include<string.h>

int set_opt(int fd, int bSpeed, int dBits, char parity, int stopBit)
{
	struct termios newtio,oldtio;
	if  ( tcgetattr( fd,&oldtio)  !=  0)
        { 
		perror("tcgetattr");
		exit(1);
      	}
       
        bzero( &newtio, sizeof( newtio ) );
	newtio.c_cflag  |=  CLOCAL | CREAD;//将本地模式(CLOCAL)和串行数据接收(CREAD)设置为有效
        /*这里有两个选项应当一直打开,一个是CLOCAL,另一个是CREAD。这两个选项可以保证你的程序不会
        变成端口的所有者,而端口所有者必须去处理发散性作业控制和挂断信号,同时还保证了串行接口驱动会读取过来的数据字节。*/

        newtio.c_cflag &= ~CSIZE;//屏蔽数据位

	switch( dBits )
	{
	case 7:
		newtio.c_cflag |= CS7;
		break;
	case 8:
		newtio.c_cflag |= CS8;//8 data bits
		break;
	}
        
        //设置奇偶位
	switch(parity)
	{
	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( bSpeed )
	{
	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;
	case 460800:
		cfsetispeed(&newtio, B460800);
		cfsetospeed(&newtio, B460800);
		break;
	default:
		cfsetispeed(&newtio, B9600);
		cfsetospeed(&newtio, B9600);
		break;
	}

       //设置停止位
       if( stopBit == 1 )
	    newtio.c_cflag &=  ~CSTOPB;
	else if ( nStop == 2 )
	    newtio.c_cflag |=  CSTOPB;

        newtio.c_cc[VTIME]  = 0;//设置等待数据时间,单位:0.1秒
	newtio.c_cc[VMIN] = 100;//Minimum number of characters to read
      
        tcflush(fd,TCIFLUSH);//刷新缓冲区,让输入输出数据有效:Flush input and output buffers and make the change
        if((tcsetattr(fd,TCSANOW,&newtio))!=0)//TCSANOW标志所有改变必须立刻生效而不用等到数据传输结束
	{
		perror("com set error");
		return -1;
	}

	return 0;
}

int main(void)
{
	int atFd, nmeaFd,nset1, nwrite, nread;
   	char at[20], nmea[1024];
         
        atFd = open("/dev/ttyUSB2", O_RDWR);//打开at串口
	if (atFd == -1)
        {
             perror("atFd:");
             exit(1);
         }

         set_opt(atFd, 4800, 8, 'N', 1);//设置at串口属性         
         memset(at, 0, 20);
         memcpy(at, "AT+CGPS=1\r", sizeof("AT+CGPS=1\r"));
         nwrite = write(atFd, at, strlen(at));
         if(-1 == nwrite)
         {
              perror("at com write");
              exit(1);
         }  

         nmeaFd = open("/dev/ttyUSB1", O_RDWR);//打开nmea串口 
         if (nmeaFd == -1)
         {
             perror("nmeaFd:");
             exit(1);
         }

set_opt(nmeaFd, 4800, 8, 'N', 1);//设置nmea串口属性 while(1) { memset(nmea, 0, 1024); nread = read(nmeaFd, nmea, 1024);//读串口 if (nread > 0) { printf("\n\tGPS dataLen=%d, data:\n",nread); nmea[nread] = '\0'; printf( "%s\n", nmea); //输出所读取的数据 }  sleep(2); } close(atFd);
 close(nmeaFd);  return 0;}





                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值