PySerial: в чем разница между read() и readinto()?



Я использую pySerial 3.4 в своем коде для извлечения данных из последовательного порта (читатель/писатель RFID-чипа, если быть точным). Мне нужно отправить команду читателю, а затем прочитать от читателя для получения результатов.





В основном, я пишу команду 12 байт, а затем пытаюсь получить вывод 24 байт.
Мой вопрос: почему port.read(24) не может работать, но res = bytearray(24); port.readinto(res); работает успешно?
Прилагается полный код:



import serial

ser = serial.Serial('COM5',9600,timeout=5,rtscts=True,inter_byte_timeout=5)

def compose_find(port):
port.write(bytes.fromhex('555500000003020405'))
port.flush()
return port.read(12)[6] == 0

def compose_read(port,sec_loc=0,block_loc=0,key='F'*12):
assert sec_loc in range(0,16),'sector location is from 0~15'
assert block_loc in range(0,4),'block location is from 0~3'
assert compose_find(port),'cannot read card!'

sec_loc = '0'+str(hex(sec_loc))[2:]
block_loc = '0'+str(hex(block_loc))[2:]
command = '55 55 00 00 00 0E 03 07 00 00 {} {} 60
{}'.format(sec_loc,block_loc,key).replace(' ','')
parity = str(hex(reduce(lambda x,y:x^y,bytes.fromhex(command))))[2:]
if len(parity) == 1: parity = '0'+parity
command += parity
print(command)
port.write(bytes.fromhex(command))
port.flush()
res = bytearray(24)
port.readinto(res)
return res

compose_read(port=ser,sec_loc=8,block_loc=2)
513   1  

1 ответ:

readinto(buf) считывает до len(buf) байт и возвращает, в то время как read(num) будет блокировать, пока не будут получены байты num. Вы должны указать timeout при открытии порта, если вы хотите, чтобы read() возвращался, даже если нет достаточного количества доступных данных.

Comments

    Ничего не найдено.