PySerial и IronPython - получаю странную ошибку - PullRequest
1 голос
/ 11 июня 2010

У меня есть устройство, подключенное к 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 Ответ

2 голосов
/ 15 октября 2010

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