for 循环中的 Pyserial 对象
Pyserial objects in a for loop
我用这个方法打开了4个串口:
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'
但这行得通(少 pythonic):
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 不可能,我必须使用索引迭代器方法?
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'
for ser in serList:
遍历 serList
字典中的键。在您的情况下,键是整数,而不是 Serial 对象。
尝试:
for ser in serList:
SER_tx_command(serList[ser],set_key,keyList) # send'
我用这个方法打开了4个串口:
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'
但这行得通(少 pythonic):
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 不可能,我必须使用索引迭代器方法?
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'
for ser in serList:
遍历 serList
字典中的键。在您的情况下,键是整数,而不是 Serial 对象。
尝试:
for ser in serList:
SER_tx_command(serList[ser],set_key,keyList) # send'