PySerial和IronPython - 得到奇怪的错误

时间:2010-06-11 17:11:49

标签: ironpython pyserial

我有一台连接到COM31的设备。我创建串行连接所需的代码看起来非常简单

port = 31
trex_serial = serial.Serial(port - 1, baudrate=19200, stopbits=serial.STOPBITS_ONE, timeout=1)

当我使用Python2.6运行它时,无用的代码有效,但是当由IronPython2.6.1执行时,这就是我得到的:

Traceback (most recent call last):
  File "c:\Python26\lib\site-packages\serial\serialutil.py", line 188, in __init__

  File "c:\Python26\lib\site-packages\serial\serialutil.py", line 236, in setPort

  File "c:\Python26\lib\site-packages\serial\serialcli.py", line 139, in makeDeviceName

  File "c:\Python26\lib\site-packages\serial\serialcli.py", line 17, in device

IndexError: index out of range: 30

我不确定发生了什么。 PySerial明确表示它符合IronPython标准。 我有什么想法吗?

1 个答案:

答案 0 :(得分:2)

IronPython正在向.NET询问端口是什么。它们的列举方式不同。就IronPython / .NET而言,您很可能要求打开一个不存在的连接。要找出“真实”端口号,请使用以下从pySerial扫描示例修改的代码。然后使用列出的COM旁边的数字。

import serial

def scan():
#scan for available ports. return a list of tuples (num, name)
available = []
for i in range(256):
    try:
        s = serial.Serial(i)
        available.append( (i, s.portstr))
        s.close()   # explicit close 'cause of delayed GC in java
    except serial.SerialException:
        pass
    #You must add this check, otherwise the scan won't complete
    except IndexError as Error:
        pass

for n,s in available:
    print "(%d) %s" % (n,s)

return available

输出对我来说是这样的:

(0)COM9

(1)COM15

(2)COM16

(3)COM1

(4)COM15

然后当您尝试打开连接时,请使用左侧的数字而不是实际的COMportNumber - 1.例如,我需要打开与COM15的连接,因此使用上述扫描:

def IOCardConnect():
try:
    connection = serial.Serial(4, 115200, timeout=1, parity=serial.PARITY_NONE)
    print "Connection Succesful"
    return connection
except serial.SerialException as Error:
    print Error

此外,一旦连接,pySerial将期望字节写入连接,而不是字符串。所以请确保你这样发送:

#Use the built in bytes function to convert to a bytes array.
connection.write(bytes('Data_To_Send'))