Tratando de resolver este problema (ttyUSB0 que funciona correctamente que deja de funcionar después de aproximadamente 1 hora) Estoy pensando si desconectar y volver a conectar el dispositivo USB podría ser una buena solución.
Entonces, ¿es posible cortar la alimentación del dispositivo USB y volver a encenderlo mediante programación (bash)?
# lsusb -t 1-1:1.0: No such file or directory /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=musb-hdrc/1p, 480M |__ Port 1: Dev 2, If 0, Class=vend., Driver=, 12M |__ Port 1: Dev 2, If 1, Class=vend., Driver=cp210x, 12MEn am335x, kernel 3.2.0, ubuntu core armhf.
[ 1.784332] usb 1-1: cp210x converter now attached to ttyUSB0 En este momento necesito un ciclo de energía completo para recuperar ttyUSB0 .
Esta es la solución:
Encuentre la identidad de su dispositivo USB.
# tree /sys/bus/usb/drivers/cp210x/ /sys/bus/usb/drivers/cp210x/ |-- 1-1:1.1 -> ../../../../devices/platform/omap/musb-ti81xx/musb-hdrc.1/usb1/1-1/1-1:1.1 |-- bind |-- module -> ../../../../module/cp210x |-- remove_id |-- uevent -- unbind Entonces 1-1:1.1 es el identificador de mi ttyUSB0 (también se puede descubrir a través de dmesg ).
Luego, desconecte el dispositivo (como root):
# echo -n "1-1:1.1" > /sys/bus/usb/drivers/cp210x/unbindvolver a conectarlo
# echo -n "1-1:1.1" > /sys/bus/usb/drivers/cp210x/bind En este punto tenía el mismo dispositivo pero con un nombre diferente, ahora era ttyUSB1 en lugar de ttyUSB0. - Para evitar esto, agregué una nueva regla en /etc/udev/rules.d/ creando un nuevo archivo llamado 99-usb-serial.rules con esta línea:
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea70", ATTRS{serial}=="002DCFAF", SYMLINK+="sameName", MODE:="0666" donde idVendor , idProduct y serial deben ser los valores de su dispositivo. Esta regla creará un nuevo dispositivo llamado sameName vinculado al dispositivo ttyUSB* normalmente generado desde el sistema operativo.
Como dijo @Robert Harvey,
Primero necesita encontrar nuestro controlador que lo ayudará a 'desenchufar y enchufar' el usb. Escriba: ls /sys/bus/usb/drivers que debería imprimir algo como esto: btusb ftdi_sio hub usb usbfs usbhid usbserial_generic uvcvideo . Estos son todos los controladores para cada dispositivo usb. Ahora, digamos que el mío es ftdi_sio , que es un dispositivo que uso para programar mi arduino (chip atmega328p). No estoy seguro de cómo se nombran sus/otros dispositivos USB allí. Como, no sé cuál de estos es mi ratón. Ahora, puede ver los comandos del controlador usando: ls /sys/bus/usb/drivers/ftdi_sio/ , que imprimirá algo como: 1-4:1.0 bind module uevent unbind , Donde 1-4:1.0 es el código característico del dispositivo , y el comando bind y unbind , que son los comandos 'plug' y 'unplug' respectivamente.
Ahora, si quiero desconectar programáticamente el puerto usb ftdi, escribiré: echo -n "1-4:1.0" > /sys/bus/usb/drivers/ftdi_sio/unbind y, para volver a conectarlo: echo -n "1-4:1.0" > /sys/bus/usb/drivers/ftdi_sio/bind
Ahora, podemos combinar todos los comandos juntos, con un ';':
echo -n "1-4:1.0" > /sys/bus/usb/drivers/ftdi_sio/unbind ; echo -n "1-4:1.0" > /sys/bus/usb/drivers/ftdi_sio/bind