You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 12:30:31