linux如何通过usb端口绑定到固定的串口号

 更新时间:2025年09月08日 11:31:44   作者:技术求索者  
文章讨论了在安卓设备使用USB转串口时,由于设备号随USB枚举顺序变化导致串口无法被系统识别的问题,最初通过修改串口号解决,但发现直接修改串口号无法被系统正确映射,最终解决方法是不修改串口号,而是通过调整串口配置或延长串口可用长度,确保系统能够正确识别和映射串口

linux通过usb端口绑定到固定的串口号

我们在安卓设备上经常会用到usb转串口的设备,而usb转串口的设备生成的设备号是按usb枚举的顺序生成的,所以同一个usb设备每次开机之后生成的串口序号可能不相同,通过下面的补丁可以解决这个问题。

Index: kernel/drivers/usb/serial/usb-serial.c
===================================================================
--- kernel/drivers/usb/serial/usb-serial.c	(revision 1851)
+++ kernel/drivers/usb/serial/usb-serial.c	(working copy)
@@ -85,20 +85,74 @@
 	return port;
 }
 
-static int allocate_minors(struct usb_serial *serial, int num_ports)
+static int allocate_minors(struct usb_serial *serial, int num_ports,char * dev_name)
 {
 	struct usb_serial_port *port;
 	unsigned int i, j;
-	int minor;
+	int minor,tmpmiior;
 
 	dev_dbg(&serial->interface->dev, "%s %d\n", __func__, num_ports);
 
 	mutex_lock(&table_lock);
+printk("dev_name = %s\n",dev_name);
 	for (i = 0; i < num_ports; ++i) {
 		port = serial->port[i];
-		minor = idr_alloc(&serial_minors, port, 0, 0, GFP_KERNEL);
-		if (minor < 0)
-			goto error;
+      
+	   printk("num_ports = %d\n",num_ports);
+
+	   if(!strcmp(dev_name,"2-1.7")) //USB0
+		 {
+		 minor = idr_alloc(&serial_minors, port, 0, 4, GFP_KERNEL);
+			 if (minor < 0)
+			   goto error;
+		 }
+      else
+      	{
+	   
+	   if(!strcmp(dev_name,"1-1.1")) //USB0
+	   {
+			   minor = 5;
+	   }
+		 else if(!strcmp(dev_name,"2-1.6.1")) //USB0
+		{
+				minor = 6;
+		}
+
+		else if(!strcmp(dev_name,"2-1.5.1")) //USB0
+	   {
+			   minor = 7;
+	   }
+
+		else if(!strcmp(dev_name,"2-1.4.1")) //USB0
+ 	   {
+ 			   minor = 8;
+ 	   }
+ 	   else if(!strcmp(dev_name,"2-1.3.1"))
+ 	   {
+ 			   minor = 9; 
+ 	   }
+ 	   else if(!strcmp(dev_name,"2-1.2.1"))
+ 		{
+ 				minor = 10;
+ 		}
+	    else if(!strcmp(dev_name,"2-1.1.1"))
+ 		{
+ 				minor = 11;
+ 		}
+	  
+		 tmpmiior=idr_alloc(&serial_minors, port, 5, 20, GFP_KERNEL);
+		 if (minor < 0)
+	   		goto error;
+
+	   }
+ 	/*   else if(!strcmp(dev_name,"2-1.7"))
+ 	   {
+ 				i = 7;
+ 	   }*/
+		//minor = idr_alloc(&serial_minors, port, 0, 0, GFP_KERNEL);
+		//if (minor < 0)
+		//	goto error;
+
 		port->minor = minor;
 		port->port_number = i;
 	}
@@ -1058,7 +1112,7 @@
 	 */
 	serial->disconnected = 1;
 
-	if (allocate_minors(serial, num_ports)) {
+	if (allocate_minors(serial, num_ports,dev_name(&port->serial->dev->dev))) {
 		dev_err(ddev, "No more free serial minor numbers\n");
 		goto probe_error;
 	}

后来发现以上方法有问题,串口好是改了,系统没费配到改的串口号就是手动改的串口号并不是idr_alloc 分配出来的串口号,导致去打开的时候经常打不开

终极解决方法

如下所示:

#!/system/bin/sh

creat_tty_symlink(){
	tty0=$(ls -l /sys/class/tty/$1)
	hastty=$(ls  /sys/class/tty*)
	#goal="2-1.1"
	echo "parameter1 is "$1
	echo "hastty is "$hastty
	if [[ $tty0 == *"2-1.1"* ]] ; then
	     if [[ $hastty == *"ttyXRUSB1"* ]] ; then
		    echo "ttyXRUSB1 exsit"
		 else
			 echo "creat ttyXRUSB1"
			 rm  /dev/ttyXRUSB1
			 ln -s /dev/$1 /dev/ttyXRUSB1
			 chown system:system /dev/ttyXRUSB1
		 fi
		 
	elif  [[ $tty0 == *"2-1.2"* ]] ; then
	     if [[ $hastty == *"ttyXRUSB2"* ]] ; then
			echo "ttyXRUSB2 exsit"
		 else
		 echo "creat ttyXRUSB2"
			 rm  /dev/ttyXRUSB2
			 ln -s /dev/$1 /dev/ttyXRUSB2
			 chown system:system /dev/ttyXRUSB2
		 fi
	elif  [[ $tty0 == *"2-1.3"* ]] ; then 
	     if [[ $hastty == *"ttyXRUSB3"* ]] ; then
			echo "ttyXRUSB3 exsit"
		 else
			 echo "creat ttyXRUSB3"
			 rm  /dev/ttyXRUSB3
			 ln -s /dev/$1 /dev/ttyXRUSB3
			 chown system:system /dev/ttyXRUSB3
	     fi
	elif  [[ $tty0 == *"2-1.4"* ]] ; then 
		 if [[ $hastty == *"ttyXRUSB4"* ]] ; then
			echo "ttyXRUSB4 exsit"
		 else
			 echo "creat ttyXRUSB4"
			 rm  /dev/ttyXRUSB4
			 ln -s /dev/$1  /dev/ttyXRUSB4
			 chown system:system /dev/ttyXRUSB4			 
		fi
     else
	    echo "end"
	 fi



}


while true
do
    creat_tty_symlink ttyUSB0
	sleep 1
	creat_tty_symlink ttyUSB1
	sleep 1
    creat_tty_symlink ttyUSB2
	sleep 1
	creat_tty_symlink ttyUSB3
	sleep 1
	creat_tty_symlink ttyUSB4
	sleep 2
done

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Linux 出现telnet: 127.0.0.1: Connection refused错误解决办法

    Linux 出现telnet: 127.0.0.1: Connection refused错误解决办法

    这篇文章主要介绍了Linux 出现telnet: connect to address 127.0.0.1: Connection refused错误解决办法的相关资料,需要的朋友可以参考下
    2017-05-05
  • ubuntu 13.10编译安装mono环境(二)

    ubuntu 13.10编译安装mono环境(二)

    接上篇,上篇仅安装了Mono本身,并没有安装libgdiplus、gtk-sharp、mod_mono、MonoDevelop 等其他相关的软件。 这篇主要是配置安装libgdiplus。
    2014-07-07
  • 新版ubuntu20.04 使用root用户登录系统的详细教程

    新版ubuntu20.04 使用root用户登录系统的详细教程

    这篇文章主要介绍了新版ubuntu20.04 使用root用户登录系统的详细教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Linux下安装Fastdfs全过程

    Linux下安装Fastdfs全过程

    这篇文章主要介绍了Linux下安装Fastdfs全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Apache环境下配置多个ssl证书搭建多个站点的方法

    Apache环境下配置多个ssl证书搭建多个站点的方法

    这篇文章主要介绍了Apache环境下配置多个ssl证书搭建多个站点的方法,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07
  • Linux parted 分区命令使用解读

    Linux parted 分区命令使用解读

    这篇文章主要介绍了Linux parted 分区命令使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Linux里LVM磁盘扩容详细步骤

    Linux里LVM磁盘扩容详细步骤

    大家好,本篇文章主要讲的是Linux里LVM磁盘扩容详细步骤,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下哦,方便下次浏览
    2021-11-11
  • 13个实用的Apache Rewrite重写规则

    13个实用的Apache Rewrite重写规则

    这篇文章主要介绍了13个实用的Apache Rewrite重写规则,需要的朋友可以参考下
    2014-03-03
  • linux性能调试之vmstat分析

    linux性能调试之vmstat分析

    这篇文章主要介绍了linux性能调试之vmstat分析。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • 在Ubuntu中如何查看网络路由表详解

    在Ubuntu中如何查看网络路由表详解

    这篇文章主要给大家介绍了关于在Ubuntu中如何查看网络路由表的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用ubuntu具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12

最新评论