Disabilita DTR su ttyUSB0


11

Mi collego da Pi alla scheda Clone di Arduino. Il problema è che ho bisogno di disabilitare la linea DTR, al fine di impedire il ripristino di Arduino alla connessione.

Ho letto che su RPi non è possibile controllare DTR, DCD e altre linee. È vero per RPi a livello globale o solo per pin GPIO utilizzati per la comunicazione seriale?

Se è possibile disabilitare il DTR sulla porta USB, come si ottiene?

Risposte:


6

Le proprietà di un convertitore seriale USB non hanno nulla a che fare con l'hardware del sistema di hosting, ma solo con il chip seriale USB stesso e lo stack software del sistema di hosting.

Il pi dovrebbe usare driver seriali USB Linux di serie.

Pertanto, è possibile abilitare / disabilitare il collegamento di DTR per aprire / chiudere la porta tramite il solito metodo Linux per cancellare l' hupclimpostazione come documentato sul sito Arduino e altrove:

stty -F /dev/ttyUSB0 -hupcl

O la sostituzione di / dev / ttyUSB0 con qualsiasi file di dispositivo corrisponda effettivamente alla porta seriale USB (ad esempio, il primo Uno connesso sarebbe probabilmente / dev / ttyACM0)

Anche per quanto riguarda la porta seriale nativa del PI, questo comportamento di DTR è in definitiva sotto il controllo del software - chiunque sostenga altrimenti sta ignorando il fatto che è solo il driver Linux, e non l'hardware, a sapere che la porta sia aperto o chiuso. L'hardware della porta effettiva può solo dire che viene letto o scritto o riconfigurato, nessuno dei quali è effettivamente sinonimo di apertura del dispositivo seriale.


Funzionerà solo fino a quando l'hosting pi non verrà riavviato?
user2395126

6

Il post di @ChrisStrattons descrive come utilizzare stty -F /dev/ttyUSB0per evitare il blocco che si traduce in un ripristino. Ecco uno snippet per farlo in Python:

import termios

path = '/dev/ttyACM0'

# Disable reset after hangup
with open(path) as f:
    attrs = termios.tcgetattr(f)
    attrs[2] = attrs[2] & ~termios.HUPCL
    termios.tcsetattr(f, termios.TCSAFLUSH, attrs)

ser = serial.Serial(path, 9600)
# etc.

Si noti che il numero esatto può quando si sostituisce il cavo USB, quindi rilevo il percorso globbing:

try:
    path = glob.glob('/dev/ttyACM*')[0]
except IndexError:
    # retry, error out, etc.
    pass

Ho confermato che funziona su Ubuntu su un laptop x86_64 generico e su un Raspberry Pi 2.
Cerin

C'è qualche motivo per usarlo termios, diciamo os.system("stty -F /dev/ttyUSB0 -hupcl")? Inoltre, ho notato che questo non impedisce ad Arduino di reimpostarsi la prima volta che ci si connette dopo l'accensione del sistema host; impedisce che si reimposti su connessioni successive. Che è meglio di niente. Ma vorrei poter capire come fermarlo dall'attivare il DTR.
Jason C,

2
@JasonC L'utilizzo termiossalva un fork / exec (call) in un programma esterno ( stty). Non sono sicuro di cosa fare riguardo alla cosa DTR, penso di aver appena accettato questa "caratteristica" e di aver aggiunto un po 'di logica (stretta di mano personalizzata scrivendo / leggendo) per rilevare se Arduino e l'applicazione sul Pi si sincronizzavano.
Lekensteyn,

La mia soluzione definitiva era quella di aggiungere il comando stty all'avvio di pi, seguito da un'eco alla porta per forzare il primo ripristino e un ritardo di 3 secondi per attendere il ripristino di arduino. Quindi non devo pensarci più dopo, né preoccuparmene negli script Python. L'ho fatto in rc.local ma ovunque. Il costo è +3 secondi pi tempo di avvio.
Jason C,

3

È possibile aggiungere un resistore da 120 Ohm (o una combinazione per creare 120 Ohm) tra RESETe 5VCiò impedirà il ripristino completo. Questo è il meno invasivo in quanto altre soluzioni richiedono la rimozione di un resistore o un condensatore dalla scheda, complicando i caricamenti. Non conservare la resistenza se si sta programmando. Rimuoverla.

inserisci qui la descrizione dell'immagine

Le schede Leonardo non si ripristinano anche se DTRvengono attivate, ma il problema inizia quando è necessario ripristinarlo in remoto poiché a volte perde la connessione a Raspberry e è necessario ripristinarlo fisicamente.


3
Non sono sicuro che questo meriti un voto negativo. Fa schifo farlo, e non è basato su software, ma dopo alcune ricerche sembra essere la soluzione hardware funzionante.
Jason C,

0

Se si utilizza Seria e la libreria pySerial, è possibile utilizzare:

ser = serial.Serial ('/ dev / ttyACM0', 9600, dsrdtr = True)


-1

Puoi usare PySerial. Ecco un esempio sul codice Python:

port =serial.Serial(
    "/dev/ttyUSB0",
    baudrate=57600,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS,
    dsrdtr = False
    )

per ulteriori opzioni, selezionare Pyserial.


1
Questo non è un problema di libreria. Ho provato alreadz 4 librerie diverse, sempre lo stesso risultato: i comandi DTR vengono ignorati.
jnovacho,

Se questa è un'affermazione accurata di qualcosa che funziona su un altro Linux, dovrebbe funzionare anche su pi, poiché l'hardware pi ospita solo software linux generico e non è coinvolto in modo univoco.
Chris Stratton,

1
Questo non funziona Su Linux, questo causa ancora il ripristino di Arduino.
Cerin,

1
Posso confermare che questo non funziona su qualsiasi versione di Pi e Arduino che ho (non lo so, scusa, non so nulla di queste cose, non voglio sapere, mi è stato appena dato un sistema per eseguire il debug del codice eh.) Inoltre, non sono sicuro che sia correlato, ma stty -F /dev/ttyUSB0 -cdtrdsrriporta invalid argument: -cdtrdsr.
Jason C,
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.