Python的实时数据曲线显示(接收网口数据)实际应用

   最近在单片机调试采集波形数据时,不知道采集的数据所呈现的效果。对数据的仿真又需要借助其他软件或者设备,非常不方便,所以自己想写个软件,可以直接调试,这样怎么方便怎么来,只要达到效果就好。

    博主虽然学的是单片机,主要用的C,但是之前野心很大,即学过Android Studio、QT、MyEclipse 10也学过PyCharm以及IDLE,当然了学的都是皮毛,哈哈,不多扯了。但是博主还是要说一下哈,综合考量下来,还是觉的Python比较实用,方便快捷,上手快。因此想到可以通过Python软件自己写一个软件,直接对数据进行处理显示。

    先上几张效果图

图1.正弦波的采集数据描点

Python的实时数据曲线显示(接收网口数据)实际应用_第1张图片

 图2 方波的采集数据描点

Python的实时数据曲线显示(接收网口数据)实际应用_第2张图片

 图3.三角波的采集数据描点

Python的实时数据曲线显示(接收网口数据)实际应用_第3张图片

 整体上分析判断,数据的采集没有失真,和原波形基本一致,能够清晰的看到数据的走向和呈现的形式。

 下面来具体看一下Python的实现方法:(直接上程序吧,相信很多使用的人都没耐心看这一堆废话,能使用会使用就行。)

网口的连接和数据处理

import socket  #网口
import pyqtgraph as pg #画图
import threading  #线程
import array #数组
import numpy as np #数学基础库
import time #时间
i = 0
def socket1():
    while(True):
            dat = sockfd.recv(2)#单次读取一个数据 int.from_bytes(sockfd.,byteorder='little')  # 格式转换
#            print(dat.hex())#打印实时数据查看
            if(dat.hex()=='aa55' or dat.hex()=='bbcc'):#帧头 帧尾识别去掉不显示
                print(dat.hex())
            else:
                dat=int.from_bytes(dat,byteorder='big')#格式转换2个字节 一个点
                global i
                if i < historyLength :#数据处理

                    data[i] = dat
                    i = i+1
                else:
                    data[:-1] = data[1:]
                    data[i-1] = dat                       
def plotData():
    curve.setData(data)#实时数据呈现

if __name__ == "__main__":
    app = pg.mkQApp()  # 建立app
    win = pg.GraphicsWindow()  # 建立窗口
    win.setWindowTitle(u'pyqtgraph逐点画波形图')#自定义名称
    win.resize(800, 500)  # 小窗口大小--可自定义窗口大小
    data = array.array('i')  # 可动态改变数组的大小,double型数组
    historyLength = 600  # 横坐标长度 
    data=np.zeros(historyLength).__array__('d')#把数组长度定下来
    p = win.addPlot()  # 把图p加入到窗口中
    p.showGrid(x=True, y=True)  # 把X和Y的表格打开
    p.setRange(xRange=[0, historyLength], yRange=[0, 255], padding=0)#坐标设置
    p.setLabel(axis='left', text='y / V')  # 靠左
    p.setLabel(axis='bottom', text='x / point')
    p.setTitle('Wave')  # 表格的名字
    curve = p.plot()  # 绘制一个图形
#   curve.setData(data)
from socket import *

sockfd = socket(AF_INET, SOCK_STREAM)    # 默认值其实就是这个, tcp套接字
try:
    sockfd.connect(('192.168.1.100', 502))#网口的目标IP地址和端口号
    print('连接上了服务器')            # 连接上,就显示一下
except Exception as e:
    print('连接失败',e)        # 处理一下连接失败

th1 = threading.Thread(target=socket1)  #目标函数一定不能带()
th1.start()
timer = pg.QtCore.QTimer()
timer.timeout.connect(plotData)  # 定时刷新数据显示
#print(data.hex()) #打印数据查看效果
timer.start(1000)  # 多少ms调用一次,刷新显示数据的时间间隔

app.exec_()    #应用运行呈现

就这些代码就能实时显示网口接收到的数据,是不是很简单,当然了串口也可以这样使用,相对来说更简单些,不在这里叙述了。对于调试和仿真单片机的工程师来说这个还是非常实用的,喜欢的收藏点赞吧。

不懂的和数据处理有问题的可以一起探讨,不足之处请指正,多谢支持!

你可能感兴趣的:(python,开发语言,单片机)