2010-07-06 134 views
2

在超级终端中,我可以连接到名为“X64-CL_iPro_1_Serial_0”的串行端口,我可以在该端口上向相机发送/接收ASCII文本。然而,当我尝试连接到与pySerial相同的端口,它抛出一个异常:使用pySerial连接到非COM端口

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

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

我的代码是非常简单的,看起来像这样:

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

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

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

+0

什么操作系统,这是? (增加:哦,可能是Windows,因为你有COM1和COM2,对...) – detly 2010-07-08 11:53:31

回答

1

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

  1. 它使用一个固定的GUID_CLASS_COMPORT来枚举。它应该通过SetupDiClassGuidsFromName来询问GUID,传递“Ports”作为它要求名称的类的描述。
  2. 该代码坚持要求友好的港口名称。但是如果唯一的目标是打开设备(而不是显示给用户),它应该直接访问DevicePath元素,这是一个看起来很奇怪但是完全有效的端口名称,可以传递给pySerial。友好的名字甚至可能完全缺失。
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,也许这就是超级终端为你做的。 pyserial不这样做,那么也许你需要打开的端口是这样的:

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