Python - 使用多个拆分的串行数据进行计算

时间:2016-02-19 09:16:05

标签: python class methods arduino-uno

  1. 我使用Arduino从传感器接收数据(4种数据:湿度,温度,光电池和毫秒)
  2. 数据如下:串行缓冲区中的xx xx xx xxxx。 (数据空间数据空间等......)
  3. 我将这条线分开以隔离每个数据,因为我想为每个传感器进行单独的计算。
  4. 每个传感器的计算包括:((latest_data) - (data_of_previous_line),latest_data)以获得每个传感器的元组。我希望所有传感器元组出现在同一行中。
  5. 使用1个传感器和1个方法(calculate())执行此操作正常但如果我在sensors()对象中添加第二个传感器则无效!
  6. 问题:如何使用至少2个传感器数据来完成所有这些工作?

    (以下代码与1“分裂”传感器数据完美配合。

    提前致谢。

    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')
    

1 个答案:

答案 0 :(得分:0)

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

来立即返回所有传感器
return [ str(share_a.calculate(a)), str(share_b.calculate(b)), str(share_c.calculate(c)), str(share_d.calculate(d)) ]

以上将返回包含所有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 )

我希望这有用。