Impostazione del numero seriale sul dispositivo USB-seriale CH340


9

Leggendo http://playground.arduino.cc/Linux/Udev sembra esserci un modo per scrivere su una EEPROM seriale USB FTDI per impostare un determinato numero seriale, permettendoti di identificare un determinato nano / altro arduino per gestirlo in modo specifico in UDEV.

Ho un boad in stile nano con un adattatore seriale USB HL-340 QinHeng Electronics, che chiaramente non è un chip FTDI, e quindi il programmatore FTDI non funziona. Qualcuno conosce un'utilità alternativa / dove posso trovare informazioni per fare lo stesso con questo chip?

Attualmente il dispositivo si 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

Il che è essenzialmente inutile, poiché non riesco a identificare la scheda fornita (quando allego due, i loro dettagli sono gli stessi).



1
Sfortunatamente, questa non è in realtà una risposta a nessuno dei due: la domanda (in quanto non risponde se esiste un modo per assegnare un nuovo numero seriale come si può fare per i chip FTDI) o per risolvere il problema (come il seriale udev poiché tutte queste schede, come Leonardo, è 0, quindi udev non è in grado di distinguere tra più schede collegate allo stesso computer.
jvc26

Il mio link è alla mia risposta che parla della creazione di regole udev per ogni dispositivo.
PhillyNJ,

1
Se riesci a leggere il cinese (non posso) questa pagina potrebbe essere d'aiuto: wch.cn/products.php?page=procontent&id=40
Craig

3
Sfortunatamente @Phil Vallone il problema è che non esiste un serial univoco per identificare il dispositivo tramite udev. Per rilevare e identificare un dispositivo unico, è necessario qualcosa di unico per differenziarli. Questi dispositivi hanno lo stesso iSerial, quindi non puoi differirli su quello e condividono gli stessi ID prodotto e fornitore - quindi non c'è un differenziatore ... Grazie per il tuo aiuto, purtroppo non risolve questo problema !
jvc26,

Risposte:


3

Non esiste spazio di archiviazione sul CH340 e sulla famiglia di UART in cui è possibile inserire un ID univoco. Questo è anche un problema per il tipo PL2303. Ho cercato di trovare soluzioni a questo problema. La prima e più semplice è la posizione del dispositivo sul bus USB. Sarà unico per ogni dispositivo. Se stai usando Linux puoi trovare ogni dispositivo in / dev / serial / by-path. C'è anche un / dev / serial / by-id ma ci sarà una sola voce lì per questo dispositivo perché mostra l'ultimo connesso. I chip FTDI avranno ciascuno voci uniche qui. I chip economici non lo faranno, ma ognuno di essi ha una voce in / dev / serial / by-path. Questa posizione e i nomi dei dispositivi dovrebbero persistere durante i riavvii. Se hai apportato molte modifiche ai tuoi dispositivi USB, collega tutti i dispositivi CH340 allo stesso hub, quindi collegalo. I dispositivi verranno enumerati nell'ordine in cui sono collegati all'hub. Questo trucco a un hub dovrebbe funzionare anche per MacOS e Windows, dovrebbero presentarsi nello stesso ordine.

Metodo più duro - regole udev. Per i dispositivi con un ID univoco come FTDI è possibile impostare una regola udev che visualizzi il suo numero seriale e quindi crei un collegamento simbolico a quel dispositivo, è semplice.

Per i dispositivi con lo stesso numero di serie o nessun numero, è molto più complesso. Ho creato una regola udev simile a questa:

SOTTOSISTEMA == "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"

quando il dispositivo corrisponde al prodotto e al fornitore dell'arduino economico, esegue lo script "cheapduino.py" con il dispositivo come argomento, ad esempio

cheapduino.py ttyUSB0

Quindi lo script cheapduino si collega via seriale al dispositivo e invia la stringa 'ID' e il software sul dispositivo risponde DEVID = THX1138 o altro. Lo script crea quindi un collegamento simbolico / dev / THX1138 che punta a / dev / ttyUSB0

Ci sono molti svantaggi di questo metodo. Lo script deve scadere se il software su cheapduino non risponde. Inoltre, questo non sta usando la funzione SYMLINK di udev, quindi non pulirà i collegamenti morti al momento della disconnessione, ma li sovrascriverà al momento della riconnessione. Tutti i tuoi cheapduinos devono avere questa funzionalità nel loro software, con diversi ID dispositivo impostati. Tutti devono usare la stessa velocità di trasmissione dello script a meno che non si desideri scrivere uno script molto complesso che richiede molto tempo. Infine, questo metodo funziona molto meglio con un baud rate basso che con un baud rate elevato, che per motivi di tempistica potrebbe non riuscire ogni volta. (cheapduinos sono economici!) 9600 funziona molto meglio di 115200 che funziona dopo diversi tentativi. Ma poiché tutti i tuoi arduinos CH340 devono avere la stessa velocità con questo metodo, puoi solo andare lento come il tuo dispositivo più veloce.

Questo metodo FUNZIONA però, ed è quello che sto usando perché ho comprato troppe di queste cose economiche.

Alla fine, acquista Arduinos originali o almeno quelli con chip FTDI o qualcos'altro che invia un ID dispositivo univoco.

= Rich


2

Se quello che vuoi è distinguere 2 dispositivi sostanzialmente identici, hai 2 modi:

  • collegarli sempre alle stesse porte e utilizzare l'albero USB per differenziarli
  • creare un protocollo di handshake, in cui ogni Arduino utilizza un codice precedentemente memorizzato nelle rispettive EEPROM. Potrebbe anche essere possibile scrivere una funzione di supporto per UDEV, in modo che la funzione di supporto esegua l'handshake e indichi a UDEV il seriale memorizzato in ciascuna EEPROM. Ciò consentirebbe di scrivere una regola UDEV per i tuoi dispositivi.


1

Metti un Maxim DS18S20 sulla tua scheda, ognuno ha un numero di serie univoco e sono molto economici. Ci sono molti esempi di software su Internet usando questo dispositivo. Potresti risolvere il problema con il nano. per funzionare richiede un resister da 4,7 K collegato a +5 e una connessione di terra. È possibile collegare a terra entrambe le connessioni 5V e terra del dispositivo. Sarebbe facile risolvere questo problema con il nano, quindi con una semplice comunicazione tramite un pin è possibile ottenere il numero seriale. Sono disponibili diversi pacchetti. Con cura è possibile utilizzare un pin di input, leggere il seriale e salvarlo per un utilizzo futuro. Quando inizia, lo farà di nuovo. Assicurati solo che l'input non sia ridotto al minimo durante il processo di init.

In bocca al lupo,

Gil


Una volta che non stai risolvendo il problema nel seriale USB, ma piuttosto con qualcosa che richiede la collaborazione del processore sulla scheda per scoprirlo, potresti anche semplicemente modificare il bootloader per contenere un numero seriale leggibile sia lì che in un'applicazione programma (es. "schizzo")
Chris Stratton,

Che assurdità. DS18S20 è un termometro digitale!
Elmue,

Sì, è un termometro; Sì, ha un numero di serie univoco che non richiede la modifica del codice o eeprom su ciascuna scheda. Economico e semplice. Svantaggio che il micro deve rispondere. Funzionerà senza cambiare IDE o qualsiasi firmware ecc. Tuttavia richiede un pin che può essere aggirato con un mux se necessario.
Gil

1

Odio dirlo, ma la risposta è no, non c'è modo di identificare in modo univoco più convertitori usb-serial basati su 340.

Ho lo stesso problema, in cui ho più (4+) convertitori USB-seriale, ognuno potrebbe essere collegato a qualsiasi porta, e sono stati acquistati contemporaneamente e quindi sono identici in ogni modo (incluso iSerial di 0).

Fondamentalmente, se muovo le cose, devo collegarmi a mano per vedere cosa è attaccato, esaminare l'output di dmesg, ecc. È un grande dolore.

tom

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.