Configuración del número de serie en el dispositivo serie USB CH340


9

Al leer http://playground.arduino.cc/Linux/Udev parece que hay una manera de escribir en una EEPROM serie USB FTDI para establecer un número de serie dado, lo que le permite identificar un nano / otro arduino determinado para manejarlo específicamente en UDEV

Tengo una placa de estilo nano con un adaptador serie USB HL-340 de QinHeng Electronics, que claramente no es un chip FTDI, por lo que el programador FTDI no funciona. ¿Alguien sabe de una utilidad alternativa / donde puedo encontrar información para hacer lo mismo con este chip?

Actualmente el dispositivo se identifica con:

[ 6850.608080] usb 2-1.2: new full-speed USB device number 7 using ehci-pci
[ 6850.701496] usb 2-1.2: New USB device found, idVendor=1a86, idProduct=7523
[ 6850.701505] usb 2-1.2: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[ 6850.701510] usb 2-1.2: Product: USB2.0-Serial
[ 6850.702201] ch341 2-1.2:1.0: ch341-uart converter detected
[ 6850.704210] usb 2-1.2: ch341-uart converter now attached to ttyUSB0

Lo cual es esencialmente inútil, ya que no puedo identificar la placa adjunta (cuando adjunto dos, sus detalles son los mismos).



1
Desafortunadamente, esta no es realmente una respuesta a ninguno de los dos: la pregunta (ya que no responde si hay una manera de asignar un nuevo número de serie como se puede hacer para los chips FTDI), o resolver el problema (como la serie de udev por todas estas tablas, como el de Leonardo, es 0, por lo tanto, udev no puede distinguir entre múltiples tablas adjuntas a la misma computadora.
jvc26

Mi enlace es a mi respuesta que habla sobre la creación de reglas de udev para cada dispositivo.
PhillyNJ

1
Si puede leer chino (no puedo) esta página podría ayudar: wch.cn/products.php?page=procontent&id=40
Craig

3
Desafortunadamente, @Phil Vallone, el problema es que no hay una serie única para identificar el dispositivo a través de udev. Para detectar e identificar un dispositivo único, necesita algo único para diferenciarlos. Estos dispositivos tienen el mismo iSerial, por lo que no puede diferenciarlos y comparten las mismas ID de producto y proveedor, por lo que no hay un diferenciador ... Gracias por su ayuda, desafortunadamente no soluciona este problema. !
jvc26

Respuestas:


3

No hay almacenamiento en el CH340 y la familia de UART donde puede colocar una identificación única. Esto también es un problema para el tipo PL2303. He estado tratando de encontrar soluciones para este problema. Primero y más fácil es la posición del dispositivo en el bus USB. Será único para cada dispositivo. Si está utilizando Linux, puede encontrar cada dispositivo en / dev / serial / by-path. También hay un / dev / serial / by-id, pero solo habrá una entrada para este dispositivo porque muestra la última conectada. Los chips FTDI tendrán cada uno entradas únicas aquí. Los chips baratos no lo harán, pero cada uno tiene una entrada en / dev / serial / by-path. Esta posición y los nombres de los dispositivos deben persistir durante los reinicios. Si tiene muchos cambios en sus dispositivos USB, conecte todos los dispositivos CH340 en el mismo concentrador, luego conéctelo. Los dispositivos se enumerarán en el orden en que están conectados al concentrador. Este truco de un solo concentrador debería funcionar para MacOS y Windows también, deberían aparecer en el mismo orden.

Método más difícil: reglas de udev. Para dispositivos con una ID única como FTDI, puede establecer una regla udev que vea su número de serie y luego cree un enlace simbólico a ese dispositivo, es sencillo.

Para dispositivos con el mismo número de serie o ninguno, es mucho más complejo. Creé una regla de udev que se ve así:

SUBSISTEMA == "tty", ATTRS {product} == "USB2.0-Serial", RUN + = "/ usr / local / bin / cheapduino.py% k", ATTRS {idVendor} == "1a86", ATTRS { idProduct} == "7523", ENV {ID_MM_DEVICE_IGNORE} = "1"

cuando el dispositivo coincide con el producto y el proveedor del arduino barato, ejecuta el script 'cheapduino.py' con el dispositivo como argumento, por ejemplo

cheapduino.py ttyUSB0

Luego, el script cheapduino se conecta en serie al dispositivo y envía la cadena 'ID' y el software en el dispositivo responde DEVID = THX1138 o lo que sea. El script crea un enlace simbólico / dev / THX1138 que apunta a / dev / ttyUSB0

Hay muchos inconvenientes en este método. El script debe agotar el tiempo de espera si el software del cheapduino no responde. Además, esto no está utilizando la función SYMLINK de udev, por lo que no limpiará los enlaces muertos al desconectarse, pero los sobrescribirá al volver a conectarlos. Todos sus dduinos baratos deben tener esta funcionalidad en su software, con diferentes ID de dispositivo establecidos. Todos deben usar la misma velocidad en baudios que el script a menos que desee escribir un script muy complejo que lleve mucho tiempo. Finalmente, este método funciona mucho mejor a baja velocidad en baudios que a alta velocidad en baudios, lo que por razones de tiempo puede no tener éxito cada vez. (¡los cheapduinos son baratos!) 9600 funciona mucho mejor que 115200, que funciona después de varios intentos. Pero dado que todos sus arduinos CH340 deben tener la misma velocidad con este método, solo puede ir tan lento como su dispositivo más rápido.

Sin embargo, este método sí funciona, y es lo que estoy usando porque compré demasiadas de estas cosas baratas.

Al final, compre Arduinos genuinos o al menos unos con chips FTDI o algo más que envíe una identificación de dispositivo única.

= Rico


2

Si lo que quiere es distinguir 2 dispositivos que son básicamente idénticos, tiene 2 formas:

  • siempre conéctelos en los mismos puertos y use el árbol USB para diferenciarlos
  • cree un protocolo de protocolo de enlace, donde cada Arduino usa un código que haya almacenado previamente en sus respectivas EEPROM. Incluso podría ser posible escribir una función auxiliar para UDEV, de modo que la función auxiliar haga el apretón de manos y le diga a UDEV la serie que está almacenada en cada EEPROM. Eso permitiría escribir una regla UDEV para sus dispositivos.


1

Coloque un Maxim DS18S20 en su placa, cada uno tiene un número de serie único y son muy económicos. Hay muchos ejemplos de software en Internet que utilizan este dispositivo. Podrías molestarlo con el nano. Para funcionar necesita una resistencia 4.7K conectada a +5 y una conexión a tierra. Puede conectar las conexiones de tierra y 5V del dispositivo a tierra. Sería fácil molestarlo con el nano, luego, mediante una simple comunicación a través de un pin, puede obtener el número de serie. Hay varios paquetes disponibles. Con cuidado, podría usar un pin de entrada, leer el serial y guardarlo para uso futuro. Cuando se inicie, volverá a hacer esto. Solo asegúrese de que la entrada no sea baja durante el proceso de inicio.

Buena suerte,

Gil


Una vez que no esté resolviendo el problema en la serie USB, sino con algo que requiera la cooperación del procesador en la placa para descubrir, también podría modificar el gestor de arranque para que contenga un número de serie legible tanto allí como en una aplicación programa (es decir, "boceto")
Chris Stratton

Que tontería. ¡El DS18S20 es un termómetro digital!
Elmue

Sí, es un termómetro; Sí, tiene un número de serie único que no requiere cambiar el código o eeprom en cada placa. Barato y simple. Inconveniente el micro tiene que responder. Funcionará sin cambiar el IDE o cualquier firmware, etc. Sin embargo, requiere un pin que se pueda solucionar con un mux si es necesario.
Gil

1

Odio decirlo, pero la respuesta es no, no hay forma de identificar de manera única múltiples convertidores USB-serie basados ​​en 340.

Tengo el mismo problema, donde tengo múltiples (4+) convertidores usb-serial, cualquiera podría conectarse a cualquier puerto, y se compraron al mismo tiempo y, por lo tanto, son idénticos en todos los sentidos (incluido iSerial de 0).

Básicamente, si muevo las cosas, tengo que conectarme a mano para ver qué está conectado, examinar la salida de dmesg, etc. Es un gran dolor.

tom

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.