Я общаюсь с синхронным усилителем SR830 через кабель RS232. При чтении данных, как в следующем коде:
import serial
def main():
ser = serial.Serial(
port='COM6',
baudrate=19200,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS)
ser.timeout=1
ser.write("OUTP? 1 \r\n".encode()) #Asks the Lock-in for x-value
ser.write("++read\r\n".encode())
x=ser.readline()
print (x)
if __name__ == '__main__': main()
Я получаю строку байтов, например b'-3.7486e-008\r'
. Однако функция ser.readline()
не распознает \r как EOL. Поэтому мне приходится ждать тайм-аута каждый раз, когда я считываю данные, что будет проблематично, так как я хочу набрать как можно больше точек как можно быстрее. И длина числа сильно меняется, поэтому я не могу просто использовать, например, ser.read(12)
. Я пытался использовать io.TextIOWrapper, но мне не ясно, как это реализовать. Вот моя попытка:
import serial
import io
def main():
ser = serial.Serial(
port='COM6',
baudrate=19200,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS)
ser.timeout=1
sio = io.TextIOWrapper(io.BufferedRWPair(ser, ser))
sio.write("OUTP? 1 \r\n") #Asks the Lock-in for x-value
sio.write("++read\r\n")
x=sio.readline()
print (x)
if __name__ == '__main__': main()
Который просто печатает пустое место. Любая помощь будет высоко оценена, спасибо.
РЕДАКТИРОВАТЬ: вот мой рабочий код после ответов, используя цикл:
import serial
def main():
ser = serial.Serial(
port='COM6',
baudrate=19200,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS)
ser.timeout=5
ser.write("OUTP? 1 \r\n".encode()) #Asks the Lock-in for x-value
ser.write("++read\r\n".encode())
buffer = ""
while True:
oneByte = ser.read(1)
if oneByte == b"\r": #method should returns bytes
print (buffer)
break
else:
buffer += oneByte.decode()
if __name__ == '__main__': main()
newline='\r'
в этомTextIOWrapper
, иначе он будет искать\n
тоже. - person Eric   schedule 20.07.2017