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

30 篇文章 2 订阅
8 篇文章 0 订阅

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

ARM系统的USB串口驱动是一种用于将ARM处理器通过USB接口换为串口通信的驱动程序。在ARM系统中,由于没有传统的RS232串口接口,所以需要通过USB换芯片来实现串口通信功能。 ARM系统通常运行在嵌入式设备中,如智能手机、平板电脑、物联网设备等。这些设备通常需要与其他外部设备进行串口通信,例如与计算机进行数据传输、与传感器或执行器进行数据交互等。而USB串口驱动就是解决这种需求的一种解决方案。 USB串口驱动通常包括两个部分:驱动程序和换芯片。驱动程序是在ARM系统中运行的软件,负责与换芯片进行通信,将需要传输的串口数据换为USB数据换芯片是一种硬件设备,负责将USB信号换为合适的串口信号,以供外部设备使用。通过驱动程序和换芯片的配合,ARM系统就能够实现与其他串口设备的通信。 USB串口驱动在ARM系统中的应用非常广泛。它可以用于智能手机的与计算机之间进行数据传输,例如通过串口与计算机进行充电、数据备份、固件升级等操作。它也可以用于物联网设备与传感器或执行器之间的数据交互,例如通过串口与传感器进行数据采集或执行器控制。此外,USB串口驱动在其他嵌入式设备中也有广泛应用,例如平板电脑、工业控制设备、嵌入式系统等。 总之,ARM系统的USB串口驱动是一种重要的软硬件解决方案,它实现ARM处理器通过USB接口与外部串口设备进行通信的功能,广泛应用于各种嵌入式设备中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值