Streamlit展示Arduino数据重复生成DataFrame问题及修改需求
解决Streamlit中Arduino数据追加到同一DataFrame的问题
问题根源
- Streamlit的运行机制:每次页面刷新或代码执行时,整个脚本会重新运行,全局变量会被重置,无法累积数据。
- 原代码中
while True循环内重复调用st.write(final_data),导致每次循环生成新表格,而非更新现有表格。 - 未使用持久化存储保存已收集的数据,每次循环都重新构建DataFrame但无法保留历史数据。
修改方案
使用Streamlit的Session State持久化数据,配合容器组件实现表格动态更新,同时优化数据读取逻辑:
import serial import streamlit as st import pandas as pd from time import sleep # 初始化串口连接 try: arduino = serial.Serial('COM5', 9600, timeout=1) # 添加timeout避免阻塞 except serial.SerialException: st.error("无法连接到Arduino,请检查串口端口或设备连接") st.stop() # Streamlit应用设置 st.title('Arduino Data Table') # 初始化Session State用于持久化数据 if 'df' not in st.session_state: cols = [ 'Current', 'Temperature 1', 'Temperature 2', 'Total Voltage', 'Maximum Voltage', 'Minimum Voltage', 'Cell 1', 'Cell 2', 'Cell 3', 'Cell 4', 'Cell 5', 'Cell 6', 'Cell 7', 'Cell 8', 'Cell 9', 'Cell 10', 'Cell 11', 'Cell 12', 'Cell 13', 'State of Charge' ] st.session_state.df = pd.DataFrame(columns=cols) # 创建用于更新表格的容器 table_container = st.empty() def read_arduino_data(): """读取一组完整的Arduino数据并返回字典""" data_row = {} cols = st.session_state.df.columns.tolist() for col in cols: line = arduino.readline().decode().strip() if line: try: value = float(line.split(':')[1].strip()) data_row[col] = [value] except (IndexError, ValueError): st.warning(f"解析数据失败:{line}") return None else: st.warning("未读取到有效数据,跳过本次循环") return None return data_row def show_data(): while True: new_data = read_arduino_data() if new_data: # 将新数据追加到Session State的DataFrame中 st.session_state.df = pd.concat( [st.session_state.df, pd.DataFrame(new_data)], ignore_index=True ) # 更新容器中的表格(替换原有内容) with table_container: st.dataframe(st.session_state.df) sleep(1) # 控制刷新间隔,避免资源占用过高 if __name__ == '__main__': show_data()
关键改动说明
- Session State:
st.session_state.df在Streamlit多次脚本运行之间保存DataFrame,确保数据不会被重置。 - 表格容器:
st.empty()创建可复用容器,每次更新时替换容器内的表格内容,而非生成新表格。 - 数据读取封装:将单组数据读取逻辑封装为函数,确保读取完整的一组数据后再追加,避免数据不完整。
- 异常处理:添加串口连接、数据解析的异常捕获,提升程序稳定性。
- 刷新间隔控制:
sleep(1)限制循环频率,防止过度占用CPU资源。
内容的提问来源于stack exchange,提问作者Pritesh Shakya
相关产品推荐
相关产品推荐

