2010-06-11 10 views
1

J'ai un périphérique connecté à COM31. Et le code que je dois créer une connexion série semble très simplePySerial et IronPython - obtenez une erreur étrange

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

Le code foollowing fonctionne quand je le lance à l'aide python2.6, mais lorsqu'il est exécuté par IronPython2.6.1, voici ce que je reçois:

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 

Je ne suis pas sûr de ce qui se passe. PySerial dit clairement qu'il est conforme à IronPython. Toutes les idées que fais-je tort?

Répondre

2

IronPython demande à .NET quels sont les ports. Ils sont énumérés différemment. Très probablement vous demandez d'ouvrir une connexion qui n'existe pas en ce qui concerne IronPython/.NET. Pour connaître le "vrai" numéro de port, utilisez le code suivant modifié à partir des exemples d'analyse pySerial. Ensuite, utilisez le numéro à côté de la liste 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 

La sortie ressemble à ceci pour moi:

(0) COM9

(1) COM15

(2) COM16

(3) COM1

(4) COM15

Ensuite, lorsque vous essayez d'ouvrir la connexion, utilisez le numéro à gauche PAS le COMportNumber réelle - 1. Par exemple, je dois ouvrir une connexion à COM15, donc en utilisant l'analyse ci-dessus:

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 

En outre, Une fois connecté, pySerial s'attend à ce que les octets écrivent sur la connectio, pas sur les chaînes. Alors assurez-vous d'envoyer comme ceci:

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