2017-02-16 24 views
1

I открывающие 4 последовательных порта с помощью этого метода:Pyserial объекты в цикле

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) 

Я хочу написать общее сообщение для всех портов - это терпит неудачу:

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

Но это работает (менее вещий):

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

Это дает ошибку в этой общей функции:

сообщение
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 ### 

Ошибки:

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' 

Как я могу сделать итерацию цикла над серийными объектами порта?
Или это невозможно с помощью python, я должен использовать метод индексного итератора?

ответ

0

serList - dict не list и итерация dict выполняет итерации своих ключей. В вашем случае ключи являются целыми индексами от enumerate. Можно перебирать свои значения вместо этого (и переименовать переменную, чтобы сделать его менее запутанной)

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

или использовать list вместо того, 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

Это имеет смысл, - будет использовать это вместо. – user3736436

0
for ser in serList: 

итерацию по клавишам в serList словаре , В вашем случае ключи являются целыми, а не последовательными.

Try:

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

Это то, что ОП пытается избежать. – tdelaney

+0

Это действительно работает, но пост tdelaney ниже - это то, что я, скорее всего, буду использовать. Благодаря! – user3736436

 Смежные вопросы

  • Нет связанных вопросов^_^