Python - 具有多个拆分串行数据的计算

Python - calculations with more than one splited serial data

  1. 我使用 Arduino 从传感器接收数据(4 种数据:湿度、温度、光电池和毫秒)
  2. 数据是这样的:串行缓冲区中的 xx xx xx xxxx。 (数据 space 数据 space 等...)
  3. 我拆分这条线是为了隔离每个数据,因为我想对每个传感器进行单独计算。
  4. 每个传感器的计算包括:((latest_data) - (data_of_previous_line), latest_data) 以获得每个传感器的元组。我希望所有传感器元组出现在同一行中。
  5. 使用 1 个传感器和 1 种方法 (calculate()) 执行此操作工作正常,但如果我在 sensors() 对象中添加第二个传感器,则它不起作用!

问题:如何使用至少 2 个传感器数据使所有这些工作?

(下面的代码与 1 "splited" 个传感器数据完美配合)。

提前致谢。

class _share:

    def __init__(self):
        self.last_val = [0 for i in range(2)]

    def calculate(self, val):
        self.last_data = val
        self.last_val = [self.last_data] + self.last_val[:-1]
        diff = reduce(operator.__sub__, self.last_val)
        print (diff, val)
        return (diff, val)

share = _share()
ser = serial.Serial('/dev/ttyS1', 9600, timeout=0.1)


def sensors():

    while True:
        try:
            time.sleep(0.01)
            ser.flushInput()
            reception = ser.readline()
            receptionsplit = reception.split()

            sensor_milli = receptionsplit[3]
            sensor_pho_1 = receptionsplit[2]
            sensor_tem_1 = receptionsplit[1]
            sensor_hum_1 = receptionsplit[0]

            int_sensor_milli = int(sensor_milli)
            int_sensor_pho_1 = int(sensor_pho_1)
            int_sensor_tem_1 = int(sensor_tem_1)
            int_sensor_hum_1 = int(sensor_hum_1)

            a = int_sensor_milli
            b = int_sensor_pho_1
            c = int_sensor_tem_1
            d = int_sensor_hum_1

            return str(share.calculate(b))
        except:
            pass
        time.sleep(0.1)

f = open('da.txt', 'ab')
while 1:
    arduino_sensor = sensors()
    f.write(arduino_sensor)
    f.close()
    f = open('da.txt', 'ab')

您需要为每个传感器使用不同的 share 实例,否则计算会出错。例如,分别对 a、b、c 和 d 使用 share_a、share_b、share_c 和 share_d。现在,如果我理解正确,您可以通过将 return 更改为:

来同时 return 所有传感器
return [ str(share_a.calculate(a)), str(share_b.calculate(b)), str(share_c.calculate(c)), str(share_d.calculate(d)) ]

以上将 return 包含所有 4 个传感器的列表,然后在您的主要方法中您可以更改为:

arduino_sensor = sensors()
sensor_string ="a:%s b:%s c:%s d:%s"%( arduino_sensor[0], arduino_sensor[1], arduino_sensor[2], arduino_sensor[3] )
print sensor_string # single line screen print of all sensor data 
f.write( sensor_string )

希望对您有所帮助。