Sto provando a utilizzare pyserial per inviare dati a un arduino. Ma quando apro la porta COM, imposta DTR basso e ripristina la scheda. Tuttavia, ho la mia configurazione del codice Arduino tale che devo metterlo in modalità di ricezione seriale tenendo premuto due pulsanti per 1 secondo. Preferirei non dover fare l'input seriale all'avvio dell'arduino, se possibile.Disabilita DTR in pyserial dal codice
A quanto pare è possibile modificare il file serialWin32.py, cambiando la riga che legge:
self._dtrState = win32.DTR_CONTROL_ENABLE
a:
self._dtrState = win32.DTR_CONTROL_DISABLE
Ma, c'è un modo per disabilitare proprio questo direttamente nel mio script python ? Devo anche farlo per tutti i sistemi. Preferirei non forzare le persone a cambiare la loro configurazione seriale di base solo per usare questo script.
La porta seriale è aperta come segue:
com = serial.Serial(port, baud, timeout=1);
Aggiornamento: Alla fine ho trovato una soluzione che funziona bene per la mia messa a punto. Dal momento che non ho avuto bisogno di fare i dati seriali tutto il tempo, solo quando ho messo il dispositivo in modalità di ricezione seriale ho trovato un modo per disabilitare il reset sulla connessione seriale dallo stesso arduino.
Molti post hanno dichiarato che è possibile disattivare il ripristino DTR posizionando un resistore ~ 100 Ohm tra 5 V e ripristinato. Ma non volevo che fosse una cosa permanente. Così, invece, ho inserito una resistenza tra PD5 e reset. Poi, nel software:
void setup() {
//.......
DDRD &= ~(_BV(PD5)); //Set PD5 as input initially
PORTD |= (_BV(PD5)); //Set high
//.......
}
inline void setResetDisable(bool state)
{
if(state)
DDRD |= (_BV(PD5)); //Set PD5 as output to put 5V on reset line
else
DDRD &= ~(_BV(PD5)); //set back to input mode
}
Così ora, quando voglio essere in modalità seriale, io chiamo setResetDisable (vero) che getta 5V su quel 100 Ohm e il perno di riarmo, impedendo DTR da tirandolo basso e reimpostare il chip :) Ho quindi chiamato setResetDisable (false) quando esco dalla modalità seriale in modo che il chip possa essere programmato normalmente.
Questo non funziona per me. Anche con DTR = False, l'Arduino si reimposta ancora durante la riconnessione seriale. Sto usando la versione più recente di Pyserial 3.0.1 su Ubuntu. – Cerin
@Cerin Aveva lo stesso problema, ma l'impostazione di DTR prima di aprire la porta ora funziona per me (Python 3.5.1 su Windows 8.1 a 64 bit e l'attuale pySerial 3.1). Vedi anche il problema nel repository "nuovo" su GitHub: https://github.com/pyserial/pyserial/issues/124 – handle
Ho anche notato che facendo 'stty -hup' sulla porta si arresta anche il problema. Perchè è questo? Com'è collegato a DTR? –