最近在单片机调试采集波形数据时,不知道采集的数据所呈现的效果。对数据的仿真又需要借助其他软件或者设备,非常不方便,所以自己想写个软件,可以直接调试,这样怎么方便怎么来,只要达到效果就好。
博主虽然学的是单片机,主要用的C,但是之前野心很大,即学过Android Studio、QT、MyEclipse 10也学过PyCharm以及IDLE,当然了学的都是皮毛,哈哈,不多扯了。但是博主还是要说一下哈,综合考量下来,还是觉的Python比较实用,方便快捷,上手快。因此想到可以通过Python软件自己写一个软件,直接对数据进行处理显示。
先上几张效果图
图1.正弦波的采集数据描点
图2 方波的采集数据描点
图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_() #应用运行呈现
就这些代码就能实时显示网口接收到的数据,是不是很简单,当然了串口也可以这样使用,相对来说更简单些,不在这里叙述了。对于调试和仿真单片机的工程师来说这个还是非常实用的,喜欢的收藏点赞吧。
不懂的和数据处理有问题的可以一起探讨,不足之处请指正,多谢支持!