Python - 具有多个拆分串行数据的计算
Python - calculations with more than one splited serial data
- 我使用 Arduino 从传感器接收数据(4 种数据:湿度、温度、光电池和毫秒)
- 数据是这样的:串行缓冲区中的 xx xx xx xxxx。 (数据 space 数据 space 等...)
- 我拆分这条线是为了隔离每个数据,因为我想对每个传感器进行单独计算。
- 每个传感器的计算包括:((latest_data) - (data_of_previous_line), latest_data) 以获得每个传感器的元组。我希望所有传感器元组出现在同一行中。
- 使用 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 )
希望对您有所帮助。
- 我使用 Arduino 从传感器接收数据(4 种数据:湿度、温度、光电池和毫秒)
- 数据是这样的:串行缓冲区中的 xx xx xx xxxx。 (数据 space 数据 space 等...)
- 我拆分这条线是为了隔离每个数据,因为我想对每个传感器进行单独计算。
- 每个传感器的计算包括:((latest_data) - (data_of_previous_line), latest_data) 以获得每个传感器的元组。我希望所有传感器元组出现在同一行中。
- 使用 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 )
希望对您有所帮助。