如何仅在可用时从Arduino中提取数据并保存数据?

How to extract data from Arduino only when it is available and save the data?

我正在尝试从 Arduino 提取传感器数据。 Arduino 代码每 1 秒使用串行通信发送一次传感器数据。我的目标是显示此数据并使用 Tkinter 在 GUI 中实时绘制它。但我似乎被卡住的地方是从 Arduino 检索数据。在我的代码中,我尝试提取数据并将它们保存在多个变量中。但是,当 Arduino 仅发送 5 秒的数据(即 5 个传感器测量值)时,我的 python 代码在变量中保存了 60 多个测量值。我不知道如何解决这个问题。我被困在这里有一段时间了。这是我的 python 代码。

在给定的图片中我 运行 代码 5 秒。即 5 个测量值将从 Arduino 发送。我正在正确接收数据,但是当我处理它们并将它们分成各个变量时,我有 analog_voltage containing:80 、current:70、voltage:75 和 temperature:65 测量值它们应该只包含 5 个。我该怎么办,有什么办法可以解决这个问题吗?

当我尝试保存文件时,这也是同样的问题。对于 5 秒的数据,程序在 csv 中保存了一百万行数据。任何帮助深表感谢。感谢阅读。

arduino 数据的图像仅供参考,因为由于串行通信协议,不可能 运行 同时使用两个程序,因此数据看起来不同。

data_to_sort =[]
analog_voltage = []
Voltage= []
Current=[]
Temperature=[]

def arduino_read_serialdata():
    global ser
    ser = serial.Serial('COM4', 9600, timeout=1)
    time.sleep(1.0)
    ser.flushInput() 
    while True:
        global analog_voltage, Voltage, Temperature, Current, yp, cleaned_data, anvol
        incoming_data = ser.inWaiting()
        incoming_data = ser.readline()
        incoming_data = incoming_data.decode()
        cleaned_data = incoming_data.strip("/n")
        data_to_sort.append(cleaned_data)
  
        
        for everyrow in data_to_sort:
        
            if everyrow.startswith("Measuring voltage and current with INA219 ..."):
                pass

            elif everyrow.startswith("MAX31855 test"):
                pass
           
            elif everyrow.startswith("Initializing sensor...DONE checking reading the values now."):
                pass
           
            elif everyrow.startswith("The Analog Voltage is:"): 
                anvol = everyrow[-8:]
                anvol = float(anvol)
                analog_voltage.append(anvol)
            
            elif everyrow.startswith("Bus Voltage............:"):
                vol = everyrow[-8:]
                Voltage.append(float(vol))
           
            elif everyrow.startswith("Current..............:"):
                cur = everyrow[-8:]
                Current.append(float(cur))
           
            elif everyrow.startswith("Temperature in celcius:"):
                temp = everyrow[-7:]
                Temperature.append(float(temp))
            else:
                pass

    
        with open("Sensor_data.csv", 'w+', newline='') as output_file:
            output_file.flush()
            output_file = csv.writer(output_file)    
            fields = ['Analog Voltage V', 'Voltage V', 'Current mA', 'Temperature °C']        
            output_file.writerow(fields)
            for idx in range(0, len(analog_voltage)):
                output_file.writerow([analog_voltage[idx]])    
       if keyboard.is_pressed("q"):
            print("Manually interrupted by user")
            ser.close()
            # output_file.close()
            print("Serial port closed")
            file.close()
            print("File closed, Writing done")

你有一个数组

data_to_sort =[]

然后将每个传入行附加到它

data_to_sort.append(cleaned_data)

对于每个传入的数据,您都会处理整个数据

for everyrow in data_to_sort:

并将值添加到这四个列表中:

analog_voltage = []
Voltage= []
Current=[]
Temperature=[]

并且这些列表永远不会被清除。

应该怎么做:

  • 要么用每个传入数据清除这四个列表,要么
  • 只处理传入的线路

我个人倾向于后者。不要总是写入整个输出文件,而是使用 "a" 而不是 "w+".

仅将最后一行附加到输出文件