using PySerial don't work until port is opened

2019-08-17 14:07发布

I developed a plugin for Domoticz on a RPi3B+. This plugin is in Python. I want to send commands to a Arduino board using a USB serial port.

The plugin opens the serial port, sends a command and closes the serial port. It works well except after a reboot.

After a reboot, the port is open, and the command seems to be sent to the Arduino, but it doesn't understand it, just as if the baud rate were wrong. Arduino's Rx LED is blinking.

If I open the serial in parallel using minicom and exit minicom without resetting the parameters, then the plugin starts working properly.

Here's my code:

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

The serial port is /dev/ttyUSB0. If I try to use exclusive = True in serial.Serial(...), it fails to open the port, as if the port were already open.

Another strange thing: when the Arduino board reboots, it sends some information to the serial port. I can't read it with the plugin in Python with PySerial, but I can read it with minicom.

If I close minicom with resetting the parameters, each time I open minicom this information is read by minicom (without resetting the Arduino board) as if the input buffer has never been read, and the Python plugin still doesn't work.

How do I solve the problem?

1条回答
相关推荐>>
2楼-- · 2019-08-17 14:55

This issue was because of Arduino nano schematic where DTR signal is connected to the reset signal which makes the Arduino to reset each time the serial port is open. This post made me search the right thing on the internet. That's why opening minicom and closing without resetting the port makes it work...

When the serial is not used anymore by a process the DTR line is reset so next time a process open the serial port the DTR is driven which makes the Arduino reboot.

A way to fix it is to modify the board or two disable the DTR handling. This can be done by dsiable the HUPCL bit of the terminal lib.

Some people manage to fix it with pySerial but it does not work for me so I had to do as below...found here and here.

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()
查看更多
登录 后发表回答