串口数据示波器,变量波形实时显示源码python

因市面上缺乏理想的单片机变量波形显示工具,博主利用Python自创一款简易工具,采用PyQtGraph和PySerial实现串口数据读取与波形绘制,支持实时更新与多变量显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原创文章请勿转载 

单片机看变量波形的工具没有找到好用的,于是学了下python写了一个,界面还不会写,参数格式要在代码中改。

效果图:

环境配置:  

pip install pyserial#串口模块

 pip install pyqtgraph#显示波形的界面

 pip install PyQt5#界面要Qt的支持

其他缺啥按啥吧

代码:

import serial
import pyqtgraph as pg
import numpy as np
import array
import threading
from time import sleep
import re

app = pg.mkQApp()
win = pg.GraphicsWindow()
win.setWindowTitle(u'波形显示')
p = win.addPlot()#win.addPlot()添加一个波形窗口,多次调用会将窗口分成多个界面

data_dict = {}#存放所有收到的数据
p.addLegend() #不添加就显示不了图例 ,一定要放在plot前调用

Max_count = 500 #页面最多显示的数据个数

#配置波形显示信息
def DisplayConfig():   
    p.showGrid(x=True,y=True, alpha=0.5)
    p.setLabels(left='y/V',bottom='x/point',title='imu')#left纵坐标名 bottom横坐标名
    label = pg.TextItem()
    p.addItem(label)
    

#将串口收到的数据添加到字典
#数据格式 “name1,float;name2,flaot\n”  
def AddDataToDict(line):
    line = line.split("\\n") #目的是去除最后的\n换行,别的方式还没用明白
    str_arr = line[0].split(';')#因为上边分割了一下,所以是数组
    color = ['b','g','r', 'c','m','y', 'k','w']#颜色表,这些应该够了,最多8条线,在添加颜色可以用(r,g,b)表示
    for a in str_arr: #遍历获取单个变量 如“a,1;b,2;c,3”中的"a,1"
        s = a.split(',')#提取名称和数据部分
        if(len(s) != 2):#不等于2字符串可能错了,正确的只有名称和数据两个字符串
            return
        name = s[0]
        val_str = re.findall(r"^[-+]?([0-9]+(\.[0-9]*)?|\.[0-9]+)([eE][-+]?[0-9]+)?$",s[1])[0]#用正则表达式提取数字部分
        if(len(val_str)>0):#再判断下是否匹配到了数字
            val = float(val_str[0])#转成浮点型数字
            if(data_dict.get(name) == None): #判断是否存在添加当前键值,None则需要添加键值                  
                #curve = p.plot(pen = color[len(data_dict)],name=name,symbolBrush=color[len(data_dict)])#为新的变量添加新的曲线,显示数据点
                curve = p.plot(pen = color[len(data_dict)],name=name)#为新的变量添加新的曲线
                data_dict[name] = [curve]  #在字典中添加当前键值,并赋值曲线,字典数据格式{key:[curve,[dadta1,data2,...]]}
                data_dict[name].append([val])#将当前数据已列表的形式添加到字典对象中
            else:#键值存在直接添加到对应的数据部分
                if(len(data_dict[s[0]][1]) == Max_count):#限制一下页面数据个数
                    data_dict[s[0]][1]=data_dict[s[0]][1][1:-1]
                    data_dict[s[0]][1][-1] = float(s[1])
                else:
                    data_dict[s[0]][1].append(val)
        else:#接收错误
            print("error:" + a)
            return 
        

def addToDisplay():
    for i in data_dict.items():
        data = i[1][1] #数据部分
        curve = i[1][0] #当前的线
        # if(len(data) > 1000):#一个界面都数据控制在1000个
        #     data=data[-1000:]
        # else:
        #     data = data[:]
        curve.setData(data)#添加数据显示


def ComRecvDeal():
    t = InitCom('com5',460800) #串口号和波特率自行设置
    if(t.isOpen() == True):      
        t.flushInput() #先清空一下缓冲区
        while(True):
            line = t.readline().decode() #line是bytes格式,使用decode()转成字符串
            AddDataToDict(line)#把收到的数据添加到字典中
    else:
        print("串口打开失败")
    

def InitCom(port,b):
    t = serial.Serial(port,b)
    return t

if __name__ == "__main__":
    th= threading.Thread(target=ComRecvDeal)#创建串口接收线程
    th.start()
    timer = pg.QtCore.QTimer()
    timer.timeout.connect(addToDisplay) #定时刷新数据显示
    timer.start(10)
    app.exec_()
    

 数据格式说明:

    “name1,float;name2,float; ... \ n”

name:变量的名字,float变量的值,一次可以传多组变量,中间用分号“;”隔开,一行数据要以“\ n”个结尾

路过帮忙扫个红包呗?

打开支付宝首页搜“616178082”领红包,领到大红包的小伙伴赶紧使用哦!

### Proteus 软件工作模式与功能介绍 #### 1. 工作模式概述 Proteus 是一种强大的电子设计自动化 (EDA) 工具,主要用于电路原理图的设计、PCB 布局以及嵌入式系统的仿真。其核心特点在于支持微控制器的联合调试和硬件仿真能力[^1]。 该工具通过虚拟环境模拟实际硬件行为,在不依赖物理设备的情况下完成测试与验证过程。它能够加载编译后的目标程序到指定的微控制器模型上,并实时观察运行效果及其对外部组件的影响。 #### 2. 主要使用方法 以下是关于如何利用 Proteus 进行 C 语言开发的相关说明: - **项目初始化**: 启动 Proteus 后创建新的设计文档,拖拽所需的元器件至绘图区域并连接线路形成完整的电路结构。 - **配置外部资源**: 对于涉及编程逻辑的部分(如单片机),需设置对应的属性参数,比如晶振频率等基本信息。 - **集成代码执行**: 将编写好的 C 源码经过 GCC 或 Keil 等工具链处理得到 HEX 文件之后上传给选定的核心单元;随后激活远程调试选项以便进一步分析控制流走向或者变量状态变化情况。 - **动态演示环节**: 开启 Debugging Session 来查看 LED 显示图案切换与否或者其他外设动作响应特征是否符合预期设定标准。 #### 3. 关键特性解析 除了上述基本操作流程之外,还有几个值得注意的功能亮点值得探讨: - 支持多种主流架构芯片(8051,PIC,AVR,MSP430 和 ARM Cortex-M系列)[^1]; - 提供丰富的库元件集合满足不同应用场景需求; - 可视化波形发生器/示波器便于信号质量评估; - SPI,I²C,UART,SPI Flash等多种通信协议建模可供学习研究. ```python # 示例 Python 伪代码展示可能的应用场景之一——串口数据收发检测脚本片段 import serial ser = serial.Serial('COM3', baudrate=9600) while True: line = ser.readline().decode('utf-8').strip() print(f'Received message: {line}') ``` 尽管这里给出的是基于 PySerial 的例子而非直接关联到 Proteus 中的操作细节,但它同样体现了现代工程师借助计算机辅助手段解决复杂技术难题的趋势方向。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值