1

我有一个连接到 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。任何想法我做错了什么?

4

1 回答 1

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'))
于 2010-10-14T20:10:36.160 回答