【问题标题】:using PySerial don't work until port is opened with minicom在使用 minicom 打开端口之前,使用 PySerial 不起作用
【发布时间】:2019-10-16 13:04:04
【问题描述】:

我在 RPi3B+ 上为 Domoticz 开发了一个插件。这个插件是用 Python 编写的。 我想使用 USB 串口向 Arduino 板发送命令。

插件打开串口,发送命令并关闭串口。它运行良好,除非重新启动。

重启后,端口打开了,命令好像是发给Arduino了,但是不明白,就好像波特率不对一样。 Arduino 的 Rx LED 正在闪烁。

如果我使用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。 如果我尝试在 serial.Serial(...) 中使用 exclusive = True,它无法打开端口,就像端口已经打开一样。

另一个奇怪的事情:当Arduino板重启时,它会向串口发送一些信息。 我不能用 PySerial 的 Python 插件读取它,但我可以用 minicom 读取它。

如果我关闭 minicom with 重置参数,每次我打开 minicom 时,minicom 都会读取此信息(不重置 Arduino 板),就好像从未读取过输入缓冲区一样,Python插件还是不行。

我该如何解决这个问题?

【问题讨论】:

    标签: python python-3.x pyserial domoticz


    【解决方案1】:

    这个问题是因为Arduino nano schematic DTR 信号连接到复位信号,这使得每次串口打开时 Arduino 都会复位。 This post 让我在互联网上搜索正确的东西。这就是为什么在不重置端口的情况下打开和关闭 minicom 使其工作......

    当进程不再使用串行时,DTR 线将被重置,因此下次进程打开串行端口时,将驱动 DTR,从而使 Arduino 重新启动。

    修复它的一种方法是 modify the board 或两个禁用 DTR 处理。这可以通过dsiable the HUPCL bit of the terminal lib 完成。

    有些人设法fix it with pySerial,但它对我不起作用,所以我必须按照以下方式进行......找到herehere

    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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 2015-04-02
      • 2017-03-22
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多