使用pySerial连接非COM端口

4
在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网站下载了此脚本,它显示了一个串口列表,但只有COM1和COM2两个端口,我都无法连接。我的代码非常简单,如下所示:
import serial
port = "X64-CL_iPro_1_Serial_0"
ser = serial.Serial(port)

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

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


这是什么操作系统?(补充:哦,可能是Windows,因为你有COM1和COM2,对吧...) - detly
2个回答

1
问题出在您链接的枚举代码上。它有两个错误:
  1. 它使用固定的GUID_CLASS_COMPORT进行枚举。相反,应该通过SetupDiClassGuidsFromName询问GUID,将“Ports”作为要请求名称的类的描述。
  2. 该代码坚持要求端口的友好名称。但是,如果唯一的目标是打开设备(而不是向用户显示),则应直接访问DevicePath元素,这是一个看起来奇怪但完全有效的端口名称,可以传递给pySerial。友好名称甚至可能完全缺失。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接