我有一个外围设备(比如带微控制器的硬件电路)。我必须通过串行通信向这个外围设备输入一些命令。这些命令嵌入到python脚本中。 我使用USB串行电缆将外围设备连接到PC。 现在我必须在pyserial中编写代码,以便PC能够自动检测外围设备所连接的com端口并成功连接到PC。(可以循环回来)
目前我在Pyserial中使用以下代码。我明确提到外围设备连接到COM1 ---
上的PCtry:
self.ser = serial.Serial(0)
#self.ser.port='/dev/ttyS1'
self.ser.baudrate = 9600
self.ser.bytesize = serial.EIGHTBITS
self.ser.parity = serial.PARITY_NONE
self.ser.stopbits = serial.STOPBITS_ONE
self.ser.timeout = 1
self.ser.xonxoff = False #disable software flow control
self.ser.rtscts = False #disable hardware (RTS/CTS) flow control
self.ser.dsrdtr = False #disable hardware (DSR/DTR) flow control
self.ser.writeTimeout = 2 #timeout for write
except Exception, e:
print "error open serial port: " + str(e)
请告诉我,如何自动检测COM端口并在之后进行连接?
答案 0 :(得分:0)
这是一个常见问题,可以通过从外围设备检查特定的返回码(通常是标识字符串)来解决。这是一个例子,使用pyserial:
from serial.tools import list_ports
def locate_port():
"""Attempt to locate the serial port to which the device
is connected."""
status_request_string = 'OI;' # Output information
expected_response = 'DISPENSEMATE'
device_port = None
for port_name, port_desc, hw_id in list_ports.comports():
with serial.Serial(port=port_name, **device_serial_settings) as ser:
ser.write(status_request_string)
if ser.readline().startswith(expected_response):
device_port = port_name
break
if not device_port:
raise UserWarning('Could not find a serial port belonging to '
'the asymtek dispensemate.')
return device_port
通常,您正在与之通信的设备的手册至少有一个命令不会更改设备的状态,而只是回显您的最后一行或返回其配置,硬件ROM版本或仅仅是名称。正是这个响应(以及请求它的命令),您需要分别填写expected_response
和status_request_string
。 device_serial_settings
是一个字典,包含波特率和奇偶校验位等参数;除了名称之外,正确连接到设备所需的一切。
正如您所看到的,上面的代码是为Asymtek Dispensemate编写的(也是旧的,因而很难获得支持)。
如果您调用该函数,则可以使用其返回值来简单地连接到设备:
port = locate_port()
my_device = serial.Serial(port, **device_serial_settings)
但有一点需要注意:如果计算机连接到多个已打开电源的串行设备,则可能会向其他设备发送非法命令。在最好的情况下,他们只是回复一个错误代码,他们的状态将不受影响,但命令也可以对这些设备进行更改,因此请检查所有其他外围设备的字典是否允许操作码"。 / p>