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