4

在超级终端中,我可以连接到一个名为“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.

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

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

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

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

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

4

2 回答 2

1

问题在于您链接的枚举代码。错在两点:

  1. 它使用固定的 GUID_CLASS_COMPORT 进行枚举。相反,它应该通过 SetupDiClassGuidsFromName 询问 GUID,传递“端口”作为它要求名称的类的描述。
  2. 代码坚持要求端口的友好名称。但是如果唯一的目标是打开设备(而不是向用户显示),它应该直接访问 DevicePath 元素,这是一个看起来很奇怪但非常有效的端口名称,可以传递给 pySerial。友好的名称甚至可能完全丢失。
于 2010-07-20T10:46:02.600 回答
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使用奇怪的 windows 符号之外的端口\\.\COM10,也许这就是 Hyperterminal 为您所做的。pyserial不这样做,所以也许你需要像这样打开端口:

s = serial.Serial("\\\\.\\X64-CL_iPro_1_Serial_0")  # also remember to escape backslash
于 2014-02-25T22:17:39.277 回答