为什么从/ sys / bus / ...中读取内容会花费很多时间?

时间:2019-05-08 21:32:58

标签: python python-3.x read-write

我正在一个项目中,该项目需要温度传感器的传感器数据。在使用open()然后再read()访问文件时,我们发现它花费了太长时间。我们隔离了要花费最多时间(大约1秒)的read()问题。有没有一种更快的替代read()的方法,或者我使用不正确?代码:

import time, os, socket

#External thermometer address: 28-031897792ede

os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')

temp_sensor = '/sys/bus/w1/devices/28-031897792ede/w1_slave'

def temp_raw():
    f = open(temp_sensor, 'r')
    lines = f.readlines()
    f.close()
    return lines

def read_temp():

    lines = temp_raw()
    while lines[0].strip()[-3:] != 'YES':
        lines = temp_raw()

    temp_output = lines[1].find('t=')

    if temp_output != -1:
        temp_string = lines [1].strip()[temp_output+2:]
        temp_c = float(temp_string) / 1000.0
        return round(temp_c, 1)

while True:
    temp_raw()

1 个答案:

答案 0 :(得分:1)

您正在打开的文件实际上不是常规的文件系统文件,它是字符设备。在Linux上,设备节点的syscall由特定的驱动程序直接实现,该驱动程序注册以处理主/次数字对,因此它们的性能取决于该驱动程序的操作系统实现。 / p>

w1-therm驱动程序常见高延迟;无论您使用哪种编程语言,它都会发生。

根据硬件的数据手册,在https://www.maximintegrated.com/en/products/sensors/DS18B20.html处,生成12位输出时的刷新率约为750ms。因此,即使其他所有条件都是绝对完美的,您每次读取的温度也大约只有3/4秒。

坦率地说,对于温度传感器而言,更快的刷新速率是没有意义的-如果设备本身的物理温度变化如此之快,以至于您每秒需要进行多次测量(考虑到时间)实际将热量传导到传感器所需的热量),您会遇到更大的问题。