Próbuję użyć pyserial do wysłania danych do Arduino. Ale kiedy otwieram port COM, ustawia on poziom DTR na niskim poziomie i resetuje kartę. Jednak mam ustawiony mój kod arduino tak, że muszę włożyć go do trybu odbioru szeregowego, przytrzymując dwa przyciski przez 1 sekundę. Wolałbym nie robić seryjnego wejścia przy starcie arduino, jeśli to możliwe.Wyłączyć DTR w pyserial z kodu
Podobno można zmodyfikować plik serialWin32.py, zmieniając linię, która brzmi:
self._dtrState = win32.DTR_CONTROL_ENABLE
do:
self._dtrState = win32.DTR_CONTROL_DISABLE
Ale, czy jest jakiś sposób, aby po prostu wyłączyć ten bezpośrednio w mój skrypt Pythona ? Też muszę to zrobić dla wszystkich systemów. Wolałbym raczej nie zmuszać ludzi do zmiany ich podstawowej konfiguracji szeregowej tylko po to, aby używać tego skryptu.
port szeregowy jest otwarty, co następuje:
com = serial.Serial(port, baud, timeout=1);
Aktualizacja: W końcu znalazłem rozwiązanie, które działa dobrze dla mojej konfiguracji. Ponieważ nie musiałem wykonywać seryjnych danych przez cały czas, tylko gdy ustawiłem urządzenie w trybie odbioru szeregowego, znalazłem sposób na wyłączenie resetowania na połączeniu szeregowym z samego urządzenia arduino.
Wiele postów powiedziało, że można wyłączyć reset DTR, umieszczając rezystor ~ 100 Ohm pomiędzy 5 V i reset. Ale nie chciałem, żeby to była stała sprawa. Zamiast tego umieściłem rezystor pomiędzy PD5 i zresetowałem. Następnie w programie:
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
}
Więc teraz, gdy chcę być w trybie seryjnym, wzywam setResetDisable (true), który rzuca 5V na tym 100 rezystor ohm i pin resetu, zapobiegając DTR ciągnie to niski i resetowanie układu :) Po prostu wywołuję setResetDisable (false), kiedy opuszczam tryb szeregowy, aby chip mógł zostać zaprogramowany jako normalny.
To nie działa dla mnie. Nawet przy DTR = False, Arduino wciąż resetuje się podczas ponownego łączenia szeregowego. Używam najnowszego wydania pyserial 3.0.1 na Ubuntu. – Cerin
@Cerin Miał ten sam problem, ale ustawienie DTR przed otwarciem portu działa teraz dla mnie (Python 3.5.1 na Windows 8.1 64 bit i aktualny pySerial 3.1). Zobacz także problem w "nowym" repozytorium na GitHub: https://github.com/pyserial/pyserial/issues/124 – handle
Zauważyłem również, że robienie 'stty -hup' na porcie również zatrzymuje problem. Dlaczego to? Jak to jest połączone z DTR? –