pyserial readline (): SerialException - PullRequest
       7

pyserial readline (): SerialException

4 голосов
/ 10 марта 2012

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

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

Когда я помещаю 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 ]

1 голос
/ 22 марта 2013

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

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
1 голос
/ 15 марта 2012

Вот фрагмент, как использовать 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
...