2015-09-18 1 views
1

Ок, я этого не понимаю. Я посмотрел везде, но я не понимаю, почему это не работает:Python: Последовательный тайм-аут не работает при использовании readline

def main(): 
    time = sys.argv[1] 
    ser = serial.Serial('/dev/ttyACM0',9600, timeout=1) 
    paramstr= "A 5 " + time + " 0 0 0" 
    ser.write(paramstr) 
    print 'sent' 
    print 'now listening...' 
    while True: 
     dbstr = ser.readline() 
     fo.write(str(dbstr)); 
    fo.close() 
    ser.close() 
    print 'exiting.' 

Это в python мой def main. То, что я делаю, отправляет строку за serial из моей малины Pi в мой Teensy (Arduino). Teensy успешно запускает программу и отправляет 1200 строк назад по serial в малину. Это работает до сих пор.

Не работает петля while. Данные записываются в файл, но цикл продолжается вечно, хотя передача (Teensy-> RPi) уже остановлена. В этом случае я реализовал timeout=1, но, похоже, его игнорируют. Программа не выходит из цикла while.

Может ли кто-нибудь помочь? Заранее спасибо!

+1

Почему вас не волнует дыхание (teensy). Ваша скорость равна «9600», поэтому нужно подождать '0,3' секунду (минимальный и каждый цикл). Какая сторона отправляет сначала (для чистого буфера)? – dsgdfg

+0

Время окончания работы после завершения команды 'read'. Вы использовали 'readline', но не знаете, сколько строк у вас есть? Попробуйте: 'ser.read (ser.inWaiting())' очистить все данные в буфере для исключения последовательного тайм-аута. – dsgdfg

+0

Не имеет значения, использую ли я 'ser.read (ser.inWaiting())' или просто 'ser.read()' или 'ser.readline()'. Малина посылает первую (одну строку), ответы Teensy/Arduino - около 1200 строк в минуту. Как вы думаете, я должен увеличить тайм-аут? – Markus

ответ

1

Таймаут не влияет на цикл while. Это повлияет только на максимальное время, в течение которого каждый вызов read() или readline() будет ждать. Если вы хотите прекратить цикл, когда вы больше не получаете данные, прекратите цикл, когда вы больше не получаете данные. Например. что-то вроде этого:

while True: 
    dbstr = ser.readline() 
    fo.write(str(dbstr)); 
    if not dbstr: 
     break 
+0

Это именно то, что я искал. Работает как шарм. Но я уверен, что пробовал это раньше, но безуспешно. Спасибо! – Markus