PySerial无法与Arduino通信
- Python版本:2.6.6
- PySerial版本:2.5
- Arduino板:Duemilanove 328
我写了一些代码来模拟我正在使用的硬件,并把它上传到了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配置:
编辑
我发现如果我把超时时间增加到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秒(具体需要多长时间我没找到确切的资料,反正这个时间可能会有所不同)。
另外,你也可以一直写数据,直到收到回复为止,收到回复后再开始进行“真正的工作”。