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 に答える