我们在EC20的软件开发中,发现使用AT指令复位模块或者控制硬件IO复位模块都会导致系统占用了原来的ttyUSB的节点,没有释放,重启模组之后系统枚举会往后面增加了一个,一旦所有节点使用完了之后,模块分配不到,将无法拨号,必须重启设备。这个该如何释放,由于现场设备较多,软件目前存在此类bug,所以请教下官方。
模块的设备名称不固定。如果用户系统没有连接其他 USB 串口设备,则模块的设备名称从
/dev/ttyUSB0 开始,如上图所示;如果用户系统连接了其他 USB 串口设备,则模块的设备名称由
USB 串口设备生成的设备节点数决定。例如,如果一个 USB 串口设备连接到用户系统并生成一个设
备节点,/dev/ttyUSB0 被 USB 串口设备占用,那么模块的设备名称从/dev/ttyUSB1 开始。
模组重启的时候,可能正常你打开了那个ttyUSB.
我建议的两个解决方法:
- 程序不要固定打开ttyUSB2 而是去打开指定的USB 接口对应的AT口
- 创建符号链接,固定指向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 口。
好的,非常感谢,我们试下。