2010-06-11 101 views
1

我有一個設備連接到COM31。而且我需要建立一個串行連接的代碼看起來很簡單PySerial和IronPython - 得到奇怪的錯誤

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

當我運行它使用python2.6的,但是當通過IronPython2.6.1執行,這是我得到的foollowing代碼工作:

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。 任何想法我做錯了什麼?

回答

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'))