从 BME680 捕获 Bosch BSEC 输出

Catching Bosch BSEC Output from BME680

大家好!

我做了什么

我正在使用 Bosch BSEC 库从 I2C 连接的 BME680 获取 IAQ 数据,方法是 运行将其作为 python 中的子进程:

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

为了不卡在这个永远-运行ning进程中,我将文件属性设置为非阻塞:

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

然后我定期检查输出以处理子进程可能已写入标准输出的任何内容:

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

这按预期可靠地工作。

问题和我的怀疑

BSEC 程序进行一些内部校准并将其状态保存到名为 bsec_iaq.state 的二进制文件中。我怀疑我 运行 的方式,我以某种方式阻止进程写入该文件。校准周期很长(4 天),文件通常大约每 8 小时写入一次,因此调试实际发生的情况有点麻烦。

糟糕的解决方法

在检查了正确的文件路径等所有细节之后,我决定简单地 运行 处理两次,一次来自我的 python 程序,一次手动。我认为子进程至少应该能够读取状态文件。令我惊讶的是,这有效,状态文件现在定期更新并且校准稳定。
这显然不是一个好主意,几天后,我注意到传感器会时不时地开始抽动一下(不同值的突然跳跃)。我想这是 运行同时使用 bsec 的两个实例的结果。

我关于阻止子进程写入状态文件的假设是否正确?
我怎样才能捕获输出并仍然允许它写入其状态? 我完全错了吗?

大家好!

我自己解决了,也许我的解决方案对那里的任何人都有用,重复我以前犯的错误。

bsec_iaq.state 应该是相对于编译的二进制 bsec 程序位置的某个地方。

当 subprocess.Popen 调用此程序时,当前工作目录设置为调用它的 python 程序的位置。

路径不匹配,找不到bsec_iaq.state文件,随后校准失败。

我本可以更改已编译的 bsec 二进制文件中的文件路径,或者为子进程设置不同的工作目录。我决定选择后者并添加参数 cwd.

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