linux usb gps,Linux下使用USB转串口读GPS数据

//----------------------------------------------------

//AUTHOR: lanyang123456

//DATE:2012-02-28

//----------------------------------------------------

内核版本2.6.18 或2.6.32 或 3.1.10

Linux内核源码中自带USB转串口驱动

目录为drivers/usb/serial,

一般情况下,系统将USB转串口驱动编译成内核模块,需要时自动加载到内核中。

将GPS设备(USB接口)插入到计算机中,系统自动识别设备,将USB转为串口,并输出信息。

命令行下查看,#dmesg

[  909.159038] usb 2-4: new full speed USB device number 5 using ohci_hcd

[  909.338158] usb 2-4: New USB device found, idVendor=067b, idProduct=2303

[  909.338166] usb 2-4: New USB device strings: Mfr=0, Product=0, SerialNumber=0

[  909.558764] USB Serial support registered for pl2303

[  909.559656] pl2303 2-4:1.0: pl2303 converter detected

[  909.594064] usb 2-4: pl2303 converter now attached to ttyUSB0

[  909.594866] usbcore: registered new interface driver pl2303

[  909.594872] pl2303: Prolific PL2303 USB to serial adaptor driver

#lsmod 可以查看新增加了模块,pl2303(GPS设备是pl2303芯片,大约多于70%的GPS设备是使用Prolific  pl2303 driver这个驱动的。)

查看目录 /dev

通过命令ls -l /dev/ttyUSB0

crw-rw---- 1 root dialout 188,0……/dev/ttyUSB0

内核2.6.18系统下

直接通过ttyUSB0读GPS数据

程序如下

#include#include#include#include#include#include#include#include#includeint set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)

{

struct termios newtio,oldtio;

if ( tcgetattr( fd,&oldtio) != 0) {

perror("SetupSerial 1");

return -1;

}

bzero( &newtio, sizeof( newtio ) );

newtio.c_cflag |= CLOCAL | CREAD;

newtio.c_cflag &= ~CSIZE;

switch( nBits )

{

case 7:

newtio.c_cflag |= CS7;

break;

case 8:

newtio.c_cflag |= CS8;

break;

}

switch( nEvent )

{

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( nSpeed )

{

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( nStop == 1 )

newtio.c_cflag &= ~CSTOPB;

else if ( nStop == 2 )

newtio.c_cflag |= CSTOPB;

newtio.c_cc[VTIME] = 0;//重要

newtio.c_cc[VMIN] = 100;//返回的最小值 重要

tcflush(fd,TCIFLUSH);

if((tcsetattr(fd,TCSANOW,&newtio))!=0)

{

perror("com set error");

return -1;

}

//printf("set done!\n\r");

return 0;

}

int main(void)

{

int fd1,nset1,nread;

char buf[1024];

fd1 = open("/dev/ttyUSB0", O_RDWR);//打开串口

if (fd1 == -1)

exit(1);

nset1 = set_opt(fd1,4800, 8, 'N', 1);//设置串口属性

if (nset1 == -1)

exit(1);

while(1)

{

memset(buf,0,1024);

nread = read(fd1, buf, 1024);//读串口

if (nread > 0){

printf("\n GPS DATALen=%d\n",nread);

buf[nread] = '\0';

printf( "GPS %s\n", buf); //输出所读数据

}

sleep(2);//睡眠,等待数据多一点

}

close(fd1);

return 0;

}

一次读的结果如下

GPS DATALen=395

GPS $GPGGA,000531.979,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*76

$GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05

$GPGSV,1,1,01,02,00,000,00*4A

$GPRMC,000531.979,V,0000.0000,N,00000.0000,E,,,270621,,*14

$GPVTG,,T,,M,,N,,K*4E

$GPGGA,000532.979,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*75

$GPRMC,000532.979,V,0000.0000,N,00000.0000,E,,,270621,,*17

$GPVTG,,T,,M,,N,,K*4E

当在内核版本为2.6.32

运行程序,读到的数据长度为0

在3.1.10下

运行程序时,程序停在open函数这,不能往下运行

曾经怀疑是USB转串口驱动有问题,自己一琢磨,不是驱动的问题,内核版本越新,驱动更完善。所以考虑应用程序中,对串口操作函数的参数问题。

解决办法:

将open 函数改为

open(“/dev/ttyUSB0”,O_RDWR|O_NONBLOCK);

程序运行即可正常。

参考:

http://hi.baidu.com/%CD%FE%B5%C4%C9%FA%BB%EE/blog/item/5cae0e2749c7c71b8a82a135.html

http://linux.chinaunix.net/techdoc/develop/2007/11/15/972357.shtml

转载请注明出处。谢谢!

USBgps驱动&测试软件 GPS是一种接收天空上的免费GPS卫星进行定位的设备。 只要卫星不掉下来。一直可以免费使用的。 有朋友以为要收费,实际上是GPS地图正版软件的收费,不是GPS服务收费。 如果你使用我们提供的免费软件。就可以一直免费使用。 我们销售的GPS品种比较多。主要的区别是使用的接收模块不一样。 所以在阅说明时注意和您购买的GPS相对应。不要选择错参数。 GPS和地图软件连接的参数主要有两个。 1.一个是串口的端口号。这个可以在安GPS驱动后,在设备管理器的硬件列表的端口下面的 USB GPS COMM PORT设备后面括号里面找到。 (进入设备列表的方法是:在桌面我的电脑图标上按鼠标右键-选择属性菜单-选择硬件菜单栏-设备管理器-点击列表里面的端口项-USB GPS COMM PORT (COM?),那个问号就是您的GPS端口号)。 2,还有一个参数是波特率。我们销售的GPS对应的波特率如下。 台湾三代USB GPS: 9600 丽台二代USB GPS:4800 真正SIRF三代 USB GPS:38400 丽台三代USB GPS: 38400 sirf新版固件:4800 这个波特率在每个导航软件里面都要使用。而且各自的设置方法不一样。 一定要留意软件的安说明里面波特率的设置方法。 我们在软件设置里面都重点说明了的。 如果端口号和波特率设置不对。就不能和地图软件对应。会出现不能定位或提示设备正在初始化等错误。 关于导航软件: 我们附送的光盘里面主要是USB GPS驱动程序和信号测试程序。WM模拟器主程序。还有领路人的导航软件。同时提供城际通和凯立德的WM模拟器版的导航软件的下载地址。 这样一起就是:驱动程序。测试程序,领路人PC版地图和换端口软件,灵图9地图,凯立德地图。 实际安的步骤是:安好驱动程序。记住端口号和自己GPS的波特率。 1.阅GPSDIAG测试软件说明。使用测试软件测试GPS正常。 这个是测试GPS是否正常使用的。 测试正常的话就可以不用测试直接开导航软件就可以了。 2.解压光盘里面的领路人软件到您本地硬盘D盘的根目录。 修改导航软件的配置文件适合自己的电脑配置。 可以参看光盘附带的领路人软件安图示。 然后直接运行使用就可以了。 具体使用方法可以进入软件后在设置里面查看软件的帮助文档。 3,凯立德地图。 安和设置凯立德地图前一定要注意退出GPSDIAG测试软件,GPSGATE和领路人导航软件。否则系统会出错。 同样城际通和凯立德也不能同时运行。 领路人,凯立德和灵图是三套不同的导航软件。不能同时使用。 您可以试用后选择合适自己的其中一套使用。其他的两种做备用。 先安光盘里面的XGPS WM模拟器主程序。阅设置说明进行设置。 主要注意。在XGPS的配置菜单,设置SDMMC目录在硬盘的位置。在映射菜单里面的第一项 选择GPS的端口号。这个端口号是在硬件列表的实际端口号。 因为CE系统不能保存设置。所以以后每次新打开XGPS模拟器,都要设置一下这两项。 XGPS默认的输出端口是COM1.所以在凯立德地图里面的配置文件都要设置端口为COM1。 否则不能正常工作。 (最新提示!可以看光盘里面的关于端口保存的图示,可以省略上面的每次都要设置外部端口的步骤了)。 安完成后的实际使用步骤:接好GPS-打开X-GPS-设置SDMMC指向和映射的端口-确认后在模拟器的 一机多图界面选择开启凯立德。 GPS驱动安步骤: 首先把附带的光盘放到电脑的光驱中。 把软件解压到电脑的硬盘里面。 XP系统下把USB GPS插到电脑的USB接口。 电脑会识别出新的硬件设备并要求安驱动。 把安目录指向光盘的《xp驱动》文件夹。 按确认就可以安好驱动了。 win7下直接运行驱动安的程序。安完成后插入GPS就会自己安好驱动。 安好驱动后在电脑的硬件列表里面检查新安的硬件。 (在我的电脑图标按右键选属性,然后点击设备管理器) 在端口类别里面可以看到有个USB GPS设备。后面用括号写着COM加数字。 这个数字就是USB GPS的端口号。 请注意。一般情况GPS在室内基本没有办法实现定位的。 一定要在室外定位。最好是比较空旷的地方。 第一次定位时间会比较长一些。属于正常现象。 定位完成后,以后再使用定位速度就快很多。 全球GPS卫星一共有32个。实际正常使用大约是28个。有几个是备用的。 基本最多能搜索到的卫星是8-12个信号。其他的卫星在地球的另外一边。是不能搜索到的。 这就是有的朋友会问我的GPS信道有20个。为什么只能收到10个的原因。 特别注意!!!由于串口信号不能共享,所以不能同时使用多个GPS地图软件或是信号测试软件。 只能单独运行信号测试软件或是导航软件。否则会引起信号检测不正常导致不能定位。 例如在开启了GPSDIAG测试软件后。就不能再同时开启地图。这样会发生无法搜星的问题。 一定要退出GPSDIAG,才能正常使用导航软件。 同样道理。两个不同的导航软件也不能同时运行。只能运行一个。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值