Pyserial readline(): SerialException

Я пишу код, используемый для отправки заказа на avr. Я отправляю несколько данных, но между каждой записью мне приходится ждать ответа (мне нужно дождаться, когда робот достигнет точки в системе координат). Как я прочитал в документации, readline() должен по крайней мере читать до таймаута, но как только я отправлю первую координату, readline() автоматически вернет:

SerialException: device reports readiness to read but returned no data (device disconnected?)

Когда я помещаю a sleep() между каждыми write() в цикле for, все работает нормально. Я пытался использовать inWaiting(), но он все еще не работает. Вот пример того, как я его использовал:

for i in chemin_python:
 self.serieInstance.ecrire("goto\n" + str(float(i.x)) + '\n' + str(float(-i.y)) + '\n')
 while self.serieInstance.inWaiting():
 pass
 lu = self.serieInstance.readline()
 lu = lu.split("\r\n")[0]
 reponse = self.serieInstance.file_attente.get(lu)
 if reponse != "FIN_GOTO":
 log.logger.debug("Erreur asservissement (goto) : " + reponse)
2 ответа

Здесь snipet, как использовать serial в python

s.write(command); 
st = ''
initTime = time.time()
while True:
 st += s.readline()
 if timeout and (time.time() - initTime > t) : return TIMEOUT
if st != ERROR: return OK
else: return ERROR


Этот метод позволяет вам отдельно контролировать тайм-аут для сбора всех данных для каждой строки и другой тайм-аут для ожидания дополнительных строк.

def serial_com(self, cmd):
 '''Serial communications: send a command; get a response'''
 # open serial port
 try:
 serial_port = serial.Serial(com_port, baudrate=115200, timeout=1)
 except serial.SerialException as e:
 print("could not open serial port '{}': {}".format(com_port, e))
 # write to serial port
 cmd += '\r'
 serial_port.write(cmd.encode('utf-8'))
 # read response from serial port
 lines = []
 while True:
 line = serial_port.readline()
 lines.append(line.decode('utf-8').rstrip())
 # wait for new data after each line
 timeout = time.time() + 0.1
 while not serial_port.inWaiting() and timeout > time.time():
 pass
 if not serial_port.inWaiting():
 break 
 #close the serial port
 serial_port.close() 
 return lines

licensed under cc by-sa 3.0 with attribution.