使用pySerial连接非COM端口

4 投票
2 回答
1883 浏览
提问于 2025-04-16 00:52

在Hyperterminal中,我可以连接到一个叫做“X64-CL_iPro_1_Serial_0”的串口,能够发送和接收ASCII文本到相机。不过,当我尝试用pySerial连接同一个端口时,出现了一个错误:

SerialException: 无法打开端口 X64-CL_iPro_1_Serial_0: [错误 2] 系统找不到指定的文件。

我不明白为什么Hyperterminal能找到这个端口并与之通信,而Python却不行。我从pySerial网站下载了这个脚本,它可以显示串口列表,但它只找到了COM1和COM2,而我都无法连接。

我的代码非常简单,像这样:

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

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

补充说明:需要注意的是,这个端口在设备管理器中也没有显示,COM1和COM2也没有。

2 个回答

0

旁白

我不太明白这个问题是关于如何在非串口的情况下使用 pyserial,还是说是关于那些在枚举中不是 COMX 端口的串口。

这可能有点偏题,或者对你来说太复杂了,但我还是先说说第一,如何在 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
1

问题出在你提到的枚举代码上。它有两个错误:

  1. 它使用了一个固定的 GUID_CLASS_COMPORT 来进行枚举。其实应该通过 SetupDiClassGuidsFromName 来获取 GUID,传入“Ports”作为你想要查询的类别的描述。
  2. 代码一直在要求端口的友好名称。但如果唯一的目的只是打开设备(而不是给用户显示),那么应该直接访问 DevicePath 元素。这个元素的名字看起来很奇怪,但实际上是一个完全有效的端口名称,可以直接传给 pySerial。友好名称甚至可能完全不存在。

撰写回答