2015-02-21 2 views
1

Я использую код python (работает на малине pi) в цикле, который очень чувствителен к времени (не должен отклоняться намного больше, чем + =. 0001 s). Я обнаружил, чтоЗачем нужна pyserial pausing python program

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): это делает.

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

Смежные вопросы