Использование PySerial не работает, пока порт не открыт с помощью minicom
Я разработал плагин для Domoticz на RPi3B+. Этот плагин в Python. Я хочу отправлять команды на плату Arduino через последовательный порт USB.
Плагин открывает последовательный порт, отправляет команду и закрывает последовательный порт. Работает хорошо кроме как после перезагрузки.
После перезагрузки порт открыт, команда, кажется, отправлена на Arduino, но она не понимает ее (как если бы скорость передачи данных была неправильной). Rx светодиод Arduino мигает.
Если я открываю сериал параллельно, используя minicom, и выхожу из minicom без сброса параметров, тогда все начинает работать правильно.
Вот мой код:
serialCmd = "gpio sh" + str( shutterId ) + "_" + order +" on for " + str( PULSE_DURATION_MS ) + "\r"
Domoticz.Debug( "Serial command : " + serialCmd )
# open serial port
try:
Domoticz.Debug( "Opening serial port : " + Parameters["SerialPort"] )
serialPort = serial.Serial( port = Parameters["SerialPort"],
baudrate = 115200,
bytesize = serial.EIGHTBITS,
parity = serial.PARITY_NONE,
stopbits = serial.STOPBITS_ONE,
timeout = 1,
xonxoff = False,
rtscts = False,
dsrdtr = False )
except:
serialPort = None
if serialPort:
serialPort.write( serialCmd.encode( 'utf-8' ) )
serialPort.close()
serialPort = None
Последовательный порт - / dev / ttyUSB0. Если я пытаюсь использовать exclusive = True в serial.Serial(...), он не может открыть порт, как будто порт уже открыт.
Еще одна странная вещь... Когда плата Arduino перезагружается, она отправляет некоторую информацию по последовательному порту. Я не могу прочитать это с помощью плагина в Python с PySerial, но я могу читать это с помощью Minicom.
Если я закрываю minicom с помощью сброса параметров, каждый раз, когда я открываю minicom, эта информация читается minicom (без сброса платы arduino), как если бы входной буфер никогда не читался, а плагин python все еще не работал.
Есть идеи?
0 ответов
Эта проблема возникла из-за схемы Arduino nano, в которой сигнал DTR соединен с сигналом сброса, который заставляет Arduino сбрасываться каждый раз при открытии последовательного порта. Этот пост заставил меня искать то, что нужно в Интернете. Вот почему открытие minicom и закрытие без сброса порта заставляет его работать...
Когда последовательный порт больше не используется процессом, строка DTR сбрасывается, поэтому в следующий раз, когда процесс откроет последовательный порт, запускается DTR, который перезагружает Arduino.
Способ исправить это - изменить плату или два отключить обработку DTR. Это можно сделать, отключив бит HUPCL библиотеки терминала.
Некоторым людям удается исправить это с помощью pySerial, но у меня это не работает, поэтому мне пришлось сделать, как показано ниже... найти здесь и здесь.
import serial
import termios
port = '/dev/ttysUSB0'
f = open(port)
attrs = termios.tcgetattr(f)
attrs[2] = attrs[2] & ~termios.HUPCL
termios.tcsetattr(f, termios.TCSAFLUSH, attrs)
f.close()
se = serial.Serial()
se.baudrate = 115200
se.port = port
se.open()