2017-02-16 2 views
1

I ouvert 4 ports série avec cette méthode:objets pyserial dans une boucle

ComPorts = ['com11','com13','com7','com19'] 
stimeout = 0.000120 ## 120 us character timeout 
baud = 115200 
serList = {} 
set_key = 0x0E 
keyList = [0,0,0,0,0,0,0,0,0] 

for idx,com in enumerate(ComPorts): ## open up the COM ports 
    serList[idx] = serial.Serial(com,baud,timeout=stimeout) 

Je veux écrire un message commun à tous les ports - ce ne parvient:

for ser in serList: 
    SER_tx_command(ser,set_key,keyList) # send' 

mais cela fonctionne (moins pythonique):

for idx in range(len(ComPorts)): 
    SER_tx_command(serList[idx],set_key,keyList) # send 

Il donne erreur dans cette fonction commune:

def SER_tx_command(ser,cmd,payload): 
    length = len(payload)+4; 
    cksum = (0x01 + length + cmd)&0x00FF 
    msg = [0x01,length,cmd] 
    if (length > 4): 
     for val in payload: 
      cksum = (cksum+val)&0x00FF 
      msg.extend([val]) 
    msg.extend([cksum]) 
    for val in msg: 
     ser.write(chr(val)) ### ERROR HERE ### 

Message d'erreur:

Traceback (most recent call last): 
    File "packet_test02.py", line 468, in <module> 
    update_key(key_jump) 
    File "packet_test02.py", line 149, in update_key 
    SER_tx_command(ser,set_key,keyList) # send the packet msg 
    File "packet_test02.py", line 28, in SER_tx_command 
    ser.write(chr(val)) 
    AttributeError: 'int' object has no attribute 'write' 

Comment puis-je faire la itérer en boucle sur les objets du port série?
Ou n'est-ce pas possible avec python, je dois utiliser la méthode de l'indexeur?

Répondre

0

serList est un dict pas list et itérer un dict ses clés Itère. Dans votre cas, les clés sont les indices entiers de enumerate. Vous pouvez itérer ses valeurs au lieu (et renommer la variable pour le rendre moins confus)

for ser in serDict.values(): 
    SER_tx_command(ser, set_key, keyList) # send' 

ou utiliser un list au lieu d'un dict

ComPorts = ['com11','com13','com7','com19'] 
stimeout = 0.000120 ## 120 us character timeout 
baud = 115200 
set_key = 0x0E 
keyList = [0,0,0,0,0,0,0,0,0] 

serList = [serial.Serial(com,baud,timeout=stimeout) for com in ComPorts] ## 
for ser in serList: 
    SER_tx_command(ser, set_key, keyList) # send' 
+0

Cela est logique - utilisera ce lieu. – user3736436

0
for ser in serList: 

itère sur les touches dans le serList dictionnaire . Dans votre cas, les clés sont des entiers, pas des objets série.

Essayez:

for ser in serList: 
    SER_tx_command(serList[ser],set_key,keyList) # send' 
+0

C'est ce que OP essaie d'éviter. – tdelaney

+0

Cela fonctionne, mais le message tdelaney ci-dessous est ce que je vais probablement utiliser. Merci! – user3736436