PySerial无法与Arduino通信

8 投票
5 回答
9551 浏览
提问于 2025-04-17 06:25

我写了一些代码来模拟我正在使用的硬件,并把它上传到了Arduino板上。这段代码是可以工作的。我知道这一点,因为我从HyperTerminal得到了预期的响应。

但是,当我尝试使用PySerial连接时,连接没有出错,但我发送的命令没有任何响应。

这可能是什么原因呢?

Python代码

import serial

def main():
    sp = serial.Serial()
    sp.port = 'COM4'
    sp.baudrate = 19200
    sp.parity = serial.PARITY_NONE
    sp.bytesize = serial.EIGHTBITS
    sp.stopbits = serial.STOPBITS_ONE
    sp.timeout = 0.5
    sp.xonxoff = False
    sp.rtscts = False
    sp.dsrdtr = False

    sp.open()

    sp.write("GV\r\n".encode('ascii'))
    value = sp.readline()
    print value
    sp.write("GI\r\n".encode('ascii'))
    value = sp.readline()
    print value

    sp.close()
 
if __name__ == "__main__":
    main()

注意:Arduino上的代码在响应命令时会在最后发送 \r\n

HyperTerminal配置:

COM4配置在HyperTerminal中

编辑

我发现如果我把超时时间增加到10秒,并在发送任何东西之前加上 sp.readline(),那么我就能收到两个命令的响应。

通常情况下,PySerial和Arduino或USB RS-232端口之间的硬件握手需要多长时间呢?

5 个回答

2

我最近也遇到了这个问题,这里是我的解决办法:

import serial

ser = serial.Serial(4, timeout=2)
ser.setRTS(True)
ser.setRTS(False)
while 1:
    line = ser.readline()
    print(line)
ser.close

结果发现,这样做可以成功重置Arduino开发板。

3

目前我在使用一种变通的方法。我把 timeout 设置为1.5秒,并在第一次写入之前加了一个 readline 的调用。

所以现在我的Python代码看起来是这样的:

import serial

def main():
    sp = serial.Serial()
    sp.port = 'COM4'
    sp.baudrate = 19200
    sp.parity = serial.PARITY_NONE
    sp.bytesize = serial.EIGHTBITS
    sp.stopbits = serial.STOPBITS_ONE
    sp.timeout = 1.5 #1.5 to give the hardware handshake time to happen
    sp.xonxoff = False
    sp.rtscts = False
    sp.dsrdtr = False

    sp.open()

    sp.readline() #to give the hardware handshake time to happen

    sp.write("GV\r\n".encode('ascii'))
    value = sp.readline()
    print value
    sp.write("GI\r\n".encode('ascii'))
    value = sp.readline()
    print value

    sp.close()

if __name__ == "__main__":
    main()
5

这段话的意思是,你可能在尝试读取数据的时候,数据还没有准备好,所以你没有收到任何回复。

为了测试这个,你可以不断地检查,直到有数据出现。

value = None
while not value:
   value = sp.readline()
print value

补充说明

当你打开串口连接时,Arduino会重启,这时候在启动过程中写入的数据可能会消失。你可以在进行任何读取或写入操作之前,先让程序暂停2秒(具体需要多长时间我没找到确切的资料,反正这个时间可能会有所不同)。

另外,你也可以一直写数据,直到收到回复为止,收到回复后再开始进行“真正的工作”。

撰写回答