Почему Pyserial приостанавливает программу Python

Я использую некоторый код Python (работающий на Raspberry Pi) в цикле, который очень чувствителен ко времени (не должен отклоняться намного больше, чем +=.0001 с). Я нашел это

if serial.Serial('/dev/ttyUSB0').read(): #what to do when there is data pending
    data = serial.Serial('/dev/ttyUSB0').read()

Кажется, проблема. Я редко отправляю что-либо через последовательное соединение, а когда я делаю, это меньше 10 байт. Кажется, этот код поддерживает программу до получения данных.

Например, если я получаю постоянный поток данных и распечатываю время выполнения для каждого цикла, оно составляет около 0,1 мс, что хорошо для моих целей, но если я ничего не получаю в течение минуты, то получаю данные, что цикл занял 60 секунд, чтобы завершить.

Мне нужно немного кода, чтобы пропустить работу и не задерживать программу, если в последовательном порту нет данных, ожидающих.

Вот более полная часть кода, которая может быть связана:

raspi=serial.Serial('/dev/ttyUSB0')

    if raspi.read(): #what to do when there is data pending
    print data #this is a messy debugging tool to see what the pi recieves
    data = raspi.read()
    raspi.write(confirmed + data) #this is the data confirmed message
    if((str(data)[0]=='s' or str(data)[0]=='S' or str(data)[0]=='b' or str(data)[0]=='B')): #this is for going straight. Command is s# or b#, # being 1-9.
        lspeed=str(data)[1]
        print('lspeed is now ' + str(lspeed))
        raspi.write('lspeed is now ' + str(lspeed))
        rspeed=str(data)[1]
        print('rspeed is now ' + str(rspeed))
        raspi.write('rspeed is now ' + str(rspeed))
    if(str(data)[0]=='r' or str(data)[0]=='R'):
        rspeed=str(data)[1]
        print('rspeed is now ' + str(rspeed))
        raspi.write('rspeed is now ' + str(rspeed))
    if((str(data)[0]=='l' or str(data)[0]=='L') and str(data)!='launch'):
        lspeed=str(data)[1]
        print('lspeed is now ' + str(lspeed))
        raspi.write('lspeed is now ' + str(lspeed))

1 ответ

Решение

Замена if serial.Serial('/dev/ttyUSB0').read(): с if(serial.Serial('/dev/ttyUSB0').inWaiting>=1): Является ли.

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

Другие вопросы по тегам