ttyUSB端口在模块复位时无法释放

image
我们在EC20的软件开发中,发现使用AT指令复位模块或者控制硬件IO复位模块都会导致系统占用了原来的ttyUSB的节点,没有释放,重启模组之后系统枚举会往后面增加了一个,一旦所有节点使用完了之后,模块分配不到,将无法拨号,必须重启设备。这个该如何释放,由于现场设备较多,软件目前存在此类bug,所以请教下官方。

奇怪的是在/dev下没看见别的被系统占用的设备号,会不会是已经被释放了,但是USB驱动每次枚举都是往后顺延呢

模块的设备名称不固定。如果用户系统没有连接其他 USB 串口设备,则模块的设备名称从
/dev/ttyUSB0 开始,如上图所示;如果用户系统连接了其他 USB 串口设备,则模块的设备名称由
USB 串口设备生成的设备节点数决定。例如,如果一个 USB 串口设备连接到用户系统并生成一个设
备节点,/dev/ttyUSB0 被 USB 串口设备占用,那么模块的设备名称从/dev/ttyUSB1 开始。

模组重启的时候,可能正常你打开了那个ttyUSB.

我建议的两个解决方法:

  1. 程序不要固定打开ttyUSB2 而是去打开指定的USB 接口对应的AT口
  2. 创建符号链接,固定指向USB AT口,应用程序固定打开对应的符号链接

我们在现场设备里对拨号程序quectel-CM设计了一个守护程序,但是在一次现场超过400台出货时出现结构问题导致SIM卡全部没识别,自启时导致一直在复位,最后/dev下没了设备号,如果有linux系统上存在释放的方式,类似reboot重启的效果,我们也可以借此优化。

是的我们只接了EC20模块,我们目前的方案就是如您所说试过软连接和在/sys/class/tty下面直接锁定AT口,没有直接指定ttyUSB2,我们在热插拔sim卡时做了软复位的处理,串口枚举一直是在顺延的直到设备没有ttyUSB。报错打印option 1-1.1:1.0: No more free serial minor numbers,似乎是只会一直往后顺延,直到设备号到一个临界值时无法再创建。不确定前面是空闲时会不会往前设定,我这边是新用户刚注册,不能提交文件,另外还有一个log也可以看出的。

这个情况就是已经将所有的miror 设备号用光了。
还是先检查下应用程序吧,改成固定打开指定interface 的设备。

感谢,我们查了应用程序,已解决,后期软连接做到udev规则里,再次感谢!!!

这里提供一个自动找口的shell脚本

#!/bin/bash

# Traversing /sys/bus/usb/devices
for usb_device in /sys/bus/usb/devices/* ; do
    if [ -e "$usb_device/idVendor" ] && [ -e "$usb_device/idProduct" ] ; then
        vid=$(cat "$usb_device/idVendor")
        pid=$(cat "$usb_device/idProduct")
	if [ "$vid" = "2c7c" ]; then
		for usb_if in $usb_device/*; do
			if [ -d $usb_if ] && [ -e "$usb_if/bInterfaceNumber" ] ; then
		        	intf=$(cat "$usb_if/bInterfaceNumber")
				if [  "$intf" = "02" ]; then
			        #echo "USB Device found:"
			        #echo "  Interface Number: $intf"
					ttyfile=$(find  "$usb_if"  -maxdepth 1 -type d  -name 'ttyUSB*' -print -quit)
					#echo "$ttyfile"
				fi
			fi
		done
	fi
    fi
done

if [ -n "$ttyfile" ]; then
	echo The target is $(basename "$ttyfile")
fi
	

这个脚本的逻辑就是遍历/sys/bus/usb/devices/ 找到usb 接口2 对应的ttyUSB 口。

好的,非常感谢,我们试下。