ARM通过usb转串口实现接收GPS数据

时间:2021-10-23 16:10:56

http://blog.csdn.net/fate_archer/article/details/13168475


前期工作是:搭建交叉编译链,网络文件系统

内核版本:Linux-3.4.2

我使用的linux内核版本是linux-3.4.2,其他内核版本也可以实现。

我的usb转串口线的芯片是pl2303,使用usb转串口接收gps数据,需要有支持usb转串口的驱动,幸好linux已经支持了,需要做的步骤如下:

内核目录下:

1.make menuconfig

usb support项中配置

USB Serial Converter Surpport相关的选项

USB Serial Converter Surpport这个配置成M

usb generic serial driver选中Y

usb prolific 2303 single port serial driver配成M
保存退出
2.make dep  //可以不用
3.make modules

4.在 /drivers/usb/serial/下有这两个驱动:pl2303.ko    usbserial.ko 
工作目录下:
把这两个驱动拷贝到你的工作目录下。我的工作目录是挂接的网络文件系统的目录 /mnt
挂接的目录下:
5.insmod usbserial.ko ,insmod pl2303.ko
6. 下面的是我写的测试程序:

#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 nSpeed, int nBits, char nEvent, int nStop)   //用来设置gps的接收参数
{
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()
{
int fd,nread; 
int i;
char buf[1024];
fd = open("/dev/ttyUSB0",O_RDWR);
if(fd)
{
printf("open success\n");
}
set_opt(fd,4800, 8, 'N', 1);
memset(buf,0,1024);
nread=read(fd,&buf,1024);
buf[nread]='\0';
sleep(2);
if(nread>0)
{
printf("ok:%d\n",nread);
buf[nread] = '\0';
printf("infoemation:%s\n",buf);
}
close(fd);
return 0;
}

总结:

加载驱动之前在开发板上插上usb转串口之后再加载驱动程序,会自动生成/dev/ttyUSB0设备节点,直接对设备节点进行读写就可以了
usb转串口线的芯片是pl2303,因为linux对它已经支持了,我们只要make menuconfig从内核里编译出模块insmod就ok了

之后测试接收的数据:

全球定位数据
$GPGGA,105032.547,3709.8889,N,12230.4613,E,0,00,,80.6,M,0.0,M,,0000*70