Я могу получить ожидаемое поведение от read (1), когда я использую последовательный объект напрямую, а не через TextIOWrapper, как показано в коде ниже. time.sleep () больше не нужен, но я сохранил его, чтобы вывод кода можно было сравнить с выводом исходного сообщения.
Я использую Python 3.7.3 и документацию для io.TextIOWrapper , которая наследуется от io.TextIOBase , явно не говорится, что чтение (N) прекращается блокировка после чтения N символов, хотя я думаю, что разумно предположить, что так и должно быть. На самом деле, документы, похоже, предполагают, что read (size = 1) является правильной реализацией, хотя вызов read таким способом вызывает ошибку «read () не принимает аргументов ключевого слова».
Я доволен непосредственным использованием последовательного объекта, но, надеюсь, кто-то может ответить на N-символьный вопрос для тех, кому может понадобиться TextIOWrapper.
import time, serial
try:
s = serial.Serial()
s.port = 'COM1'
s.baudrate = 9600
s.timeout = 20
s.open()
time.sleep(18)
start = time.time()
dat = s.read(1)
print('Initial position is %s (%0.3fs reply)' % \
(dat.decode('utf-8'), time.time()-start))
s.write('2'.encode())
s.flush()
start = time.time()
dat = s.read(1)
print('New position is %s (%0.3fs reply)' % \
(dat.decode('utf-8'), time.time()-start))
finally:
s.close()
Выход:
Initial position is 0 (0.000s reply)
New position is 2 (2.887s reply)