Получение вывода Bosch BSE C из BME680 - PullRequest
0 голосов
/ 16 июня 2020

Всем привет!

Что я сделал

Я использую библиотеку Bosch BSE C, чтобы получить данные качества воздуха в помещении с подключенного BME680 I2 C, запустив его как подпроцесс in python:

proc = subprocess.Popen(['path_to_bsec_bme680'],stdout=subprocess.PIPE, stderr=subprocess.STDOUT,shell=False)

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

flags = fcntl(proc.stdout, F_GETFL)
fcntl(proc.stdout, F_SETFL, flags | O_NONBLOCK)

Затем я проверяю вывод с регулярными интервалами для обработки того, что подпроцесс мог бы записать в стандартный вывод:

output = proc.stdout.readline().decode()

Это работает надежно, как и предполагалось.

Проблема и мои подозрения

BSE Программа C выполняет некоторую внутреннюю калибровку и сохраняет свой статус в двоичный файл с именем bsec_iaq.state. Я подозреваю, что то, как я его запускаю, каким-то образом препятствует процессу записи в этот файл. Цикл калибровки довольно длинный (4 дня), и файл обычно записывается примерно каждые 8 ​​часов, поэтому отладка того, что происходит на самом деле, представляет собой небольшую проблему. все тривиально, например, правильные пути к файлам и так далее, я решил просто запустить процесс дважды, один раз из моей программы python и один раз вручную. Я решил, что подпроцесс должен, по крайней мере, иметь возможность читать файл состояния. К моему удивлению, это сработало, файл состояния теперь регулярно обновляется, а калибровка стабильна. Это явно не лучшая идея, и через несколько дней я заметил, что датчик время от времени начинал немного подергиваться (резкие скачки разных значений). Я полагаю, это результат одновременного запуска двух экземпляров bse c.

Правильно ли я высказал предположение, что я блокирую подпроцесс от записи в файл состояния? Как я мог поймать вывод и по-прежнему позволить ему записывать свое состояние? Я go совершенно не прав?

...