我正在通过USB将Gemalto(Cinterion)调制解调器连接到我的嵌入式Linux(2.6.31),运行BusyBox和mdev。
调制解调器创建ttyACM [0-6],其中'0'用于pppd。 我时不时地得到消息和重新连接(1小时,1天......)。 整个系统更复杂 - 另一个嵌入式设备通过RS232接口连接到调制解调器,bla-bla-bla。
我的问题:
当发生断开连接和重新连接时,pppd不足以快速死亡并释放ttyACM0,因此创建了ttyACM [1-7]。下次可能是[0,2-7]或[3-8],没有具体的算法。
我尝试更新simlink(到/ dev / ttyMyModem),但是同样的“没有具体算法”问题......所有接口都是相同的 - CDC-ACM(不是吗? ??)。
我目前的做法:
一个bash脚本,包装pppd,带有无限循环,等待pppd的退出(它保留在前台,“我的选项文件中的”nodetach“)。 当pppd死掉时我删除驱动程序(modprobe -r cdc_acm),删除所有节点(rm / dev / ttyACM *),重新安装驱动程序(modprobe cdc_acm)并运行pppd。 我把需要的时间间隔延迟了1-2秒。
这个解决方案需要2-4次迭代才能重新连接(不知道它为什么不能在第一次上运行),但看起来很稳定。
我的问题:
请不要对我苛刻......
答案 0 :(得分:0)
我没有足够的代表在评论部分询问,所以我必须在这里问一下。当你说你更新符号链接时,你在谈论udev规则? 我对打印机,扫描仪等有同样的问题。在我的程序中,一旦出现写入/读取错误,我使用“udevadm info --export-db”来读取设备的正确devpath。我关闭文件描述符并在新设备上重新打开它。 你有没有试过停止断开连接?我自己无法做到,但您可以尝试禁用自动连接。使用usbcore.autosuspend = -1内核选项和:
for i in /sys/bus/usb/devices/usb*/power/control; do echo "on" > $i; done
希望有所帮助。恕我直言你的解决方案足够稳定。我已经习惯了在自动化系统中工作的这种奇怪的“解决方案”。