使用pySerial连接到非COM端口

时间:2010-07-06 14:21:08

标签: python windows-xp serial-port pyserial hyperterminal

在Hyperterminal中,我能够连接到名为“X64-CL_iPro_1_Serial_0”的串口,在那里我可以向相机发送/接收ASCII文本。但是,当我尝试使用pySerial连接到同一个端口时,它会抛出异常:

SerialException: could not open port X64-CL_iPro_1_Serial_0: [Error 2] The system cannot find the file specified.

我不明白为什么Hyperterminal可以检测端口并与之通信,但Python不能。我从pySerial网站下载了this script,显示了一个串口列表,它提供的唯一端口是COM1和COM2,我都无法连接。

我的代码很简单,看起来像这样:

import serial
port = "X64-CL_iPro_1_Serial_0"
ser = serial.Serial(port)

我做错了吗?有办法解决这个问题吗?提前谢谢。

编辑: 还应注意,此端口未显示在设备管理器中,COM1或COM2也未显示。

2 个答案:

答案 0 :(得分:1)

问题在于您链接的枚举代码。这有两个方面是错误的:

  1. 它使用固定的GUID_CLASS_COMPORT进行枚举。它应该通过SetupDiClassGuidsFromName询问GUID,传递“Ports”作为它要求名称的类的描述。
  2. 代码坚持要求提供端口的友好名称。但如果唯一的目标是打开设备(而不是向用户显示),它应该直接访问DevicePath元素,这是一个奇怪的但非常完美有效的端口名称传递给pySerial。友好的名字甚至可能完全缺失。

答案 1 :(得分:0)

<强>预留

我不清楚问题是关于通过pyserial使用非串行端口,还是枚举中不是COMX端口的串口。

这可能是一些OT或太硬的代码供您使用,但这里首先,使用pyserial对象中的其他文件:

foo = serial.Serial()
peer = serial.Serial()
foo.fd, peer.fd = posix.openpty()
try: foo._isOpen = peer._isOpen = True  # depending on pyserial version
except: pass
foo._reconfigurePort()
peer.setTimeout(timeout=0.1)
peer._reconfigurePort()

关于第二,请记住COM9以外的端口使用奇怪的窗口表示法\\.\COM10,这可能是Hyperterminal为您所做的。 pyserial没有这样做,所以也许你需要打开这样的端口:

s = serial.Serial("\\\\.\\X64-CL_iPro_1_Serial_0")  # also remember to escape backslash