为何Arduino+Streamlit采集的数据呈对角线格式而非标准表格?
问题解决:Arduino + Streamlit 流式数据表格格式修复
问题原因
当前代码的核心问题是:Arduino按单个传感器逐条发送数据,而代码每收到一条就往对应列追加一个值,同时给其他列补None,导致每一行只有一个传感器有有效数据,最终形成对角线格式。正确的逻辑应该是收集完一组6个传感器的完整数据后,再整行添加到表格中。
修复后的代码
import serial import streamlit as st import pandas as pd # 创建Arduino串口连接 arduino = serial.Serial('COM5', 9600) # 替换为你的串口端口 # 初始化存储完整组数据的列表和临时单组数据字典 full_data = [] current_group = { 'Sensor1': None, 'Sensor2': None, 'Sensor3': None, 'Sensor4': None, 'Sensor5': None, 'Sensor6': None } # 创建Streamlit应用标题和表格占位符 st.title('Arduino Data Table') table_placeholder = st.empty() # 用占位符实现表格更新,避免重复输出 while True: line = arduino.readline().decode().strip() if not line: continue # 解析单条传感器数据到临时组字典 if line.startswith("Current"): current_group['Sensor1'] = float(line.split(':')[1].strip().split(' ')[0]) elif line.startswith("Temperature 1"): current_group['Sensor2'] = float(line.split(':')[1].strip().split(' ')[0]) elif line.startswith("Temperature 2"): current_group['Sensor3'] = float(line.split(':')[1].strip().split(' ')[0]) elif line.startswith("Total Voltage"): current_group['Sensor4'] = float(line.split(':')[1].strip().split(' ')[0]) elif line.startswith("Maximum Voltage"): current_group['Sensor5'] = float(line.split(':')[1].strip().split(' ')[0]) elif line.startswith("Minimum Voltage"): current_group['Sensor6'] = float(line.split(':')[1].strip().split(' ')[0]) # 检查当前组是否已收集完所有6个传感器数据 if all(value is not None for value in current_group.values()): full_data.append(current_group.copy()) # 添加完整组数据到列表 # 重置临时组字典,准备接收下一组 current_group = { 'Sensor1': None, 'Sensor2': None, 'Sensor3': None, 'Sensor4': None, 'Sensor5': None, 'Sensor6': None } # 更新表格 table = pd.DataFrame(full_data) table_placeholder.write(table)
关键改进点
- 分组收集数据:用
current_group临时存储一组6个传感器的数据,只有当所有传感器数据都收集完成后,才将这组数据添加到full_data列表中,保证每行都是完整的一组数据。 - 使用Streamlit占位符:用
st.empty()创建占位符,每次更新表格时替换占位符内容,避免页面上生成多个重复表格。 - 重置临时字典:每次完成一组数据收集后,重置
current_group,确保下一组数据从空开始收集。
内容的提问来源于stack exchange,提问作者vanshika srivastava
相关产品推荐
相关产品推荐

