Несколько записей в файл - PullRequest
0 голосов
/ 29 ноября 2010

У меня есть следующий код Python, который ожидает данные, поступающие из последовательного порта, и записывает их в файл.

import time
import serial

def write_log ( text ):
    f = open('logger.log', 'a')
    f.write( text )
    f.close()

ser = serial.Serial()
ser.port = "/dev/ttyS0"
ser.baudrate = 4800
ser.open()
if ser.isOpen():
    while 1:
        while ser.inWaiting() <= 0:
            time.sleep(1)
            response = ser.read(ser.inWaiting())
            if len ( response ):
                write_log( response )
                print response

Работает до такой степени, что через некоторое время начинает зависать, полностью поднимая процессор и ничего не записывая (или иногда записывая только фрагменты текста) в файл .log.

Процесс здесь довольно интенсивный, так как мой последовательный порт будет записывать 8-байтовую строку каждую секунду, и этот сценарий python должен затем получить его и записать его содержимое в файл журнала.

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

Заранее спасибо,

Ответы [ 2 ]

1 голос
/ 29 ноября 2010

В вашем коде бесконечный цикл, и вы не прерываете его, когда возникает проблема - или последовательное устройство больше не открыто.

Возможно использование:

while ser.isOpen():
    while ser.inWaiting() <= 0:
        time.sleep(1)
        response = ser.read(ser.inWaiting())
        if len(response):
            write_log(response)
            print response

или даже:

while ser.isOpen() && ser.inWaiting() <= 0:
    time.sleep(1)
    response = ser.read(ser.inWaiting())
    if len(response):
        write_log(response)
        print response

Я тоже не уверен насчет сна; вам лучше подождать в считывании, чтобы данные стали доступны.

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

0 голосов
/ 29 ноября 2010

Я думаю, что проблема в том, что вы запрашиваете обновления.

Функция Python serial.read() фактически блокирует текущий поток, пока что-то не станет читаемым в потоке, до истечения времени ожидания.Поэтому вы должны создать другой поток для обработки последовательного ввода-вывода.Сделайте так, чтобы цикл продолжался бесконечно, проверяя условие (главный поток хочет, чтобы вы продолжали слушать, а последовательный порт все еще доступен).Этот поток будет делать что-то вроде:

while ser.isOpen() && thisthread_should_keep_doing_this:
    response = ser.read(ser.inWaiting())
    if len(response):
        write_log(response)
        print response

Затем, когда вы хотите, чтобы он вышел, ваш главный поток устанавливает thisthread_should_keep_doing_this=False, а когда ваш подчиненный поток завершил чтение, он убивает себя.

Две вещи:

  • Время ожидания чтения относительно часто.
  • Не "удаленно уничтожайте" поток.Передайте ему сообщение и убейте себя.Удаленное уничтожение потоков создает ужасный беспорядок.

См. http://pyserial.sourceforge.net/examples.html#miniterm

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