我有一个Python脚本,可以通过RS232串行端口与测量仪器通信。一切正常,但是每次我打开PC(Windows 10)时,通信一开始都不起作用。我必须打开一个串行终端(例如hterm),然后按“连接”和“断开连接”按钮。之后,Python脚本将按预期工作,对仪器进行读写操作就没问题了。这是代码的简短示例:
import serial, time
ser = serial.Serial(port='COM6', baudrate=19200, bytesize=8, parity=serial.PARITY_NONE, stopbits=1, timeout=0, xonxoff=False, rtscts=False, dsrdtr=False)
time.sleep(1)
print(ser.isOpen()) #output: true
ser.write(b'READ:CH1\r\n')
time.sleep(1)
print("read:" + ser.read(18).decode('utf-8'))
ser.close()
print(ser.isOpen()) #output: false
仪器未接收到数据“ READ:CH1”或任何其他命令。因此,通过ser.read()没有任何数据传输到PC。我尝试了硬件握手和很长的睡眠时间的所有可能性。我猜Windows和Pyserial之间存在问题。在Python中,端口是开放的,但Windows不会发送数据。您有什么想法我可以做什么?感谢您的帮助。
最诚挚的问候
编辑解决方案:
代替“ Serial.flushInput()”和“ Serial.flushOutput()”,或者需要“ Serial.reset_input_buffer()”和“ Serial.reset_output_buffer ()“。
[如果您使用的是第三方工具,那么脚本可以正常工作,那么我认为两侧的缓冲区中都存在一些垃圾数据,刷新硬件设备和python脚本上的串行端口也可能有效并验证在硬件设备上接收到的数据是否有可能在命令上附加了垃圾,还尝试使用一些标头位来防止此类通信中的错误。
使用一些串口嗅探器来验证正在发送的内容,例如this
看https://github.com/pyserial/pyserial/issues/329
https://github.com/pyserial/pyserial/issues/329#issuecomment-400852426
https://github.com/pyserial/pyserial/issues/329#issuecomment-503059537
你看到这个了吗?
另一个可能相关的问题:
https://github.com/pyserial/pyserial/issues/485
您可以尝试的另一件事是先打开和关闭端口。
这与您使用hterm所做的相同
ser = serial.Serial()
time.sleep(1)
print(ser.isOpen()) #output: true
ser.close()
ser = serial.Serial()
time.sleep(1)
print(ser.isOpen()) #output: true
...
这项工作吗?