Linux如何配置USB串口

本文介绍如何在Linux环境下配置USB串口驱动,并提供详细的步骤指导。此外,还包含了一个示例测试代码,帮助读者更好地理解和使用串口。

配置Linux下USB串口驱动

在linux源码根目录下输入make menuconfig,并按下“/”键进行搜索,搜索到下图所示的内容,并通过该内容的指引,将相应的串口驱动配置成下图的状态。

CH341:

 PL2303:

CP210X:

添加Linux设备树代码

在Linux设备树源码目录下找到对应开发板的设备树文件,用vim进行编辑,在设备树root的最后添加如下代码:(参考代码为EXIYNOS-FS4412开发板的适配代码,可根据实际情况进行修改)

	usbphy: usbphy@125B0000 {
		#address-cells = <1>;
		#size-cells = <1>;
		compatible = "samsung,exynos4x12-usb2phy";
		reg = <0x125B0000 0x100>;
		ranges;
		clocks = <&clock 2>, <&clock 305>;
		clock-names = "xusbxti", "otg";
		usbphy-sys {
			reg = <0x10020704 0x8 0x1001021c 0x4>;
		};
	};

	ehci@12580000 {
		status = "okay";
		usbphy = <&usbphy>;
	};
	
	usb3503@08 {
		compatible = "smsc,usb3503";
		reg = <0x08 0x4>;
		connect-gpios = <&gpm3 3 1>;
		intn-gpios = <&gpx2 3 1>;
		reset-gpios = <&gpm2 4 1>;
		initial-mode = <1>;
	};

最后不要忘记make uImage和make dtbs

Linux操作系统USB串口测试代码

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>

#include <termios.h>
#include <string.h>
#include "data_global.h"

int set_com_config(int fd, int baud_rate, int data_bits, char parity, int stop_bits)
{
	struct termios new_cfg, old_cfg;
	int speed;
	/*保存原有串口配置*/
	if (tcgetattr(fd, &old_cfg) != 0){
		perror("tcgetattr");
		return -1;
	}

	new_cfg =old_cfg;

	/*配置为原始模式*/
	cfmakeraw(&new_cfg);
	new_cfg.c_cflag &= ~CSIZE;

	/*设置波特率*/
	switch (baud_rate)
	{
		case 2400:{
					  speed = B2400;
					  break; 
				  }
		case 4800:{
					  speed = B4800;
					  break;
				  }
		case 9600:{
					  speed = B9600;
					  break;
				  }
		case 19200:{
					   speed = B19200;
					   break;
				   }
		case 38400:{
					   speed = B38400;
					   break;
				   }

		default:
		case 115000:{
						speed = B115200;
						break;
					}
	}

	cfsetispeed(&new_cfg, speed);
	cfsetospeed(&new_cfg, speed);

	/*设置数据位*/
	switch (data_bits)
	{
		case 7:{
				   new_cfg.c_cflag |= CS7;
				   break;
			   }   
		default:	
		case 8:{
				   new_cfg.c_cflag |= CS8;
				   break;
			   }
	}

	/*设置奇偶校验位*/
	switch (parity)
	{
		default:
		case 'n':
		case 'N':{
					 new_cfg.c_cflag &= ~PARENB;
					 new_cfg.c_iflag &= ~INPCK;
					 break;
				 }
		case 'o':
		case 'O':{
					 new_cfg.c_cflag |= (PARODD |PARENB);
					 new_cfg.c_iflag |= INPCK;
					 break;
				 }
		case 'e':
		case 'E':{
					 new_cfg.c_cflag |= PARENB;
					 new_cfg.c_cflag &= ~PARODD;
					 new_cfg.c_iflag |= INPCK;
					 break;
				 }
		case 's':
		case 'S':{
					 new_cfg.c_cflag &= ~PARENB;
					 new_cfg.c_cflag &= ~CSTOPB;
					 break;
				 }
	}

	/*设置停止位*/
	switch (stop_bits)
	{
		default:
		case 1:{
				   new_cfg.c_cflag &= ~CSTOPB;
				   break;
			   }   	
		case 2:{
				   new_cfg.c_cflag |= CSTOPB;
				   break;
			   }
	}

	/*设置等待时间和最小接收字符*/
	new_cfg.c_cc[VTIME] = 0;
	new_cfg.c_cc[VMIN] = 1;
	tcflush(fd, TCIFLUSH);
	if ((tcsetattr(fd, TCSANOW, &new_cfg)) != 0)
	{
		perror("tcsetattr");
		return -1;
	}

	return 0;
}



int open_port(char *com_port)
{
	int fd;

	/*打开串口*/
	fd = open(com_port, O_RDWR|O_NOCTTY|O_NDELAY);
	if (fd < 0){
		perror("open serial port");
		return -1;
	}

	/*恢复串口阻塞状态*/
	if (fcntl(fd, F_SETFL, 0) < 0){
		perror("fcntl F_SETFL\n");
	}

	/*判断是否为终端设备*/
	if (isatty(fd) == 0){
		perror("This is not a terminal device");
	}

	return fd;
}


/*--------------------CH340Ƥ׃---------------------------*/
void USB_UART_Config(char* path, int baud_rate)
{
	int fd;
	fd = open_port(path);
	if(fd < 0){
		printf("open %s failed\n",path);
		return ;
	}
	if (set_com_config(fd, baud_rate, 8, 'N', 1) < 0)
	{
		perror("set_com_config");
		return ;
	}
	close(fd);
	return ;
}



int recvDats(int fd,unsigned char *pBuf,int datalen)
{   
	int curlen= 0;   
	int reallen= 0;   
	while(curlen < datalen)    
	{        
		reallen = read(fd,pBuf+curlen, datalen-curlen);          
		if(reallen >= 0){           
			curlen+=reallen;        
		}else{          
			//printf("%s %d:%s\n",__FUNCTION__,__LINE__,"uart recv err");       
			return -1;       
		}  
	}  
	return 0;
}


int main(int argc,const char *argv[])
{
	int fd = open_port("/dev/ttyUSB0");
    char buf[80]="";
	if(fd < 0){
		printf("open failed\n");
		return -1;
	}
	set_com_config(fd, 115200, 8, 'N', 1);

	while(1)
	{
		read(fd,&buf,sizeof(buf));
		write(fd,&buf,sizeof(buf));
		printf("sizeof(buf) = %d.\n",sizeof(buf));
		printf(">>>>>>%s\n",buf);
	}
	close(fd);

	return 0;
}

用arm-linux-gcc -o uarttest uarttest.c编译后,复制到开发板上运行即可。

 

<think>首先,用户的问题是:“我想查找在Linux系统中配置USB串口驱动的方法 请问Linux系统下USB串口驱动的配置方法”。这是一个清晰的查询,我需要基于提供的引用来回答。 关键系统指令: - 所有行内数学表达式用 `$...$` 格式。 - 独立公式用 `$$...$$` 格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如:[^1] 用户提供的引用: - [^1]: 关于Linux USB串口驱动报错,添加驱动支持。 - [^2]: 虚拟机Linux系统与开发板通过USB串口连接,出现ttyUSB0设备文件。 - [^3]: 打印机使用串口接口的移植驱动程序步骤。 - [^4]: LinuxUSB串口驱动,包括设备文件和minicom配置。 用户的需求是配置USB串口驱动的方法。引用[1]提到添加USB串口驱动支持,引用[2]讨论连接方法,引用[3]是关于打印机串口移植,引用[4]详细描述了驱动加载和minicom配置。 我需要结构化回答: 1. **介绍USB串口驱动配置的基本概念**。 2. **步骤分解**:基于引用,列出配置步骤。 - 确保内核支持USB串口驱动。 - 加载驱动模块。 - 检查设备文件(如 /dev/ttyUSB0)。 - 配置串口通信参数(如波特率)。 - 使用工具如minicom测试。 3. **添加引用标识**:在相关段落末尾添加[^n]。 4. **生成相关问题**:在末尾生成相关问题。 回答结构: - 开头:简要介绍配置方法。 - 分步指南:清晰列出步骤。 - 结尾:生成相关问题。 生成相关问题: - 基于主题,如常见问题、优化、应用等。 - 示例:如何调试驱动问题?如何在虚拟机中配置?如何设置永久驱动加载? 确保中文回答。 最终回答大纲: 1. **引言**:USB串口驱动在Linux系统中的配置方法概述。 2. **步骤**: - 检查内核支持。 - 加载驱动模块。 - 确认设备出现。 - 配置串口参数。 - 测试通信。 3. **相关问题**:生成3-5个相关问题。 </think>### Linux系统下USB串口驱动配置方法 在Linux系统中配置USB串口驱动涉及多个步骤,主要包括确保内核驱动支持、加载相关模块、识别设备文件以及配置串口通信参数。以下方法基于通用Linux发行版(如Ubuntu、CentOS)进行说明,内容参考了您提供的引用并结合标准实践[^1][^2][^4]。配置的核心是让系统识别USB串口设备(如PL2303、CH340等芯片),并通过设备文件(如`/dev/ttyUSB0`)进行通信。 #### 步骤1: 检查内核支持 首先,确认Linux内核已启用USB串口驱动支持。大多数现代内核默认包含常用驱动(如`pl2303`、`ftdi_sio`),但需验证配置。 - 运行命令检查内核配置: ```bash grep CONFIG_USB_SERIAL /boot/config-$(uname -r) ``` 输出应显示类似`CONFIG_USB_SERIAL=m`(模块加载)或`=y`(内置)。如果缺失,需重新编译内核添加支持[^1][^3]。 - 对于特定驱动(如PL2303),检查模块是否存在: ```bash modinfo pl2303 # 查看PL2303驱动信息 ``` 如果报错,表示驱动未安装,需安装内核头文件后重新编译或安装驱动包(如`linux-modules-extra`)。 #### 步骤2: 加载驱动模块 插入USB串口设备后,系统应自动加载驱动模块。如未加载,手动操作。 - 列出当前USB设备: ```bash lsusb # 查看设备ID,如ID 067b:2303(PL2303芯片) ``` - 加载相关模块: ```bash sudo modprobe usbserial # 加载USB串口核心模块 sudo modprobe pl2303 # 示例:加载PL2303驱动,根据芯片替换为ftdi_sio等 ``` 驱动加载后,dmesg日志会显示设备连接信息(如`pl2303 converter detected`)[^4]。 #### 步骤3: 确认设备文件 驱动加载成功后,系统创建字符设备文件,通常在`/dev`目录下。 - 检查设备文件: ```bash ls -l /dev/ttyUSB* # 输出示例:crw-rw---- 1 root uucp 188, 0 /dev/ttyUSB0 ``` 设备文件主设备号188表示USB串口字符设备[^4]。如果未出现,检查权限: ```bash sudo chmod 666 /dev/ttyUSB0 # 添加读写权限,或添加用户到uucp组 ``` #### 步骤4: 配置串口参数 使用工具设置波特率、数据位等参数(常见为115200 8-N-1)。 - **使用minicom配置(推荐)**: - 安装minicom:`sudo apt install minicom` (Debian/Ubuntu)。 - 运行配置: ```bash minicom -s # 进入设置菜单 ``` 选择"Serial port setup",设置: - 设备名:`/dev/ttyUSB0` - 波特率:115200(根据设备调整) - 数据格式:8-N-1(8位数据、无奇偶校验、1位停止位) 保存为默认配置("Save setup as dfl"),退出后启动minicom测试通信[^2][^4]。 - **使用stty命令临时设置**: ```bash stty -F /dev/ttyUSB0 115200 cs8 -parenb -cstopb # 设置波特率115200, 8-N-1 ``` #### 步骤5: 测试通信 连接设备(如开发板或打印机),发送数据验证。 - 在minicom中发送字符,观察设备响应。 - 或使用echo命令: ```bash echo "test" > /dev/ttyUSB0 # 发送数据 ``` 如果无响应,检查设备连接和驱动日志:`dmesg | grep ttyUSB`。 #### 常见问题处理 - **驱动报错**:如日志显示`USB disconnect`,尝试更新驱动或更换USB端口[^1]。 - **虚拟机使用**:在VirtualBox/VMware中,添加USB设备过滤规则,确保设备直通到虚拟机[^2]。 - **永久配置**:编辑`/etc/modules`添加模块名(如`pl2303`),或创建udev规则固定设备权限。 以上方法覆盖了基本配置流程。如果涉及特定硬件(如打印机),需根据协议实现初始化逻辑[^3]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值