|
在嵌入式行业中,串口的多个数据可视化在工作中是经常要用的。除去在组态软件中应用较方便外,作为单独应用的也有几个。但要称得上有交互功能和实时功能的以前几乎没看到过。目前在pyqtgraph的应用中这些功能的实施已不再是高不可攀了。最近看到的一个实例相信肯定会让我们眼前一亮,不敢独享。博客地址如下: <http://blog.csdn.net/u013555402/article/details/85124452> 该作者的功力了得,且施惠与众人。非常值得敬佩! 本文参考上述博客,针对一般场合的应用在如下几个方面精简、改进。 1.适应整数数据输入(需输入浮点数据的请不用再看下去了) python的诟病是速度不快。我们平时用的数据有许多是可归一化为整数的,连numpy都可以不用了,以加快程序的运行速度,更好的适应实时化需求。 2.输入数据的出错处理 数据的第一行输入极有可能不完整,扔掉。 3.简化程序 如果串口号、输入数据及格式都正常时,该程序运行非常稳定。因此去掉了一些出错处理语句。 4.改善x轴抖动 当采样数据的个数与最大显示限制个数相同时,x轴会抖动。增加2个采样数据时,即可避免该抖动。 代码如下:(Python 3.4) import array,serial,re,threading import pyqtgraph as pg app = pg.mkQApp() win = pg.GraphicsWindow() win.setWindowTitle(u'AD波形显示') p = win.addPlot() #win.addPlot()添加一个波形窗口,多次调用会将窗口分成多个界面 data_dict = {} #存放所有收到的数据 p.addLegend() #在plot前调用显示图例 Max_count_1 = 500 #页面数据个数 Max_count_2 = Max_count_1 + 2 #避免X轴抖动 color = ['b','g','r', 'c','m','y', 'k','w'] #线的颜色表 ser = serial.Serial('com18',115200) #请自己修改成相应的串口号和波特率 ser.readline() #第一行的数据极有可能不完整,扔掉 def ComRecvDeal(): while(True): line = ser.readline().decode() #line是bytes格式,转成字符串 *** line = line.split("\\n") #去除最后的\n换行 str str_arr = line[0].split(';') #list *** str_arr.pop() for a in str_arr: s = a.split(',') name ,val = s[0], int(s[1]) #提取名称和数据部分 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_2): data_dict[s[0]][1] = data_dict[s[0]][1][1:-1] data_dict[s[0]][1][-1] = int(s[1]) #float(s[1]) else: data_dict[s[0]][1].append(val) def addToDisplay(): for i in data_dict.items(): data ,curve = i[1][1], i[1][0] data = data[( -Max_count_1):] if(len(data) > Max_count_1) else data[:] curve.setData(data) #添加数据显示 if __name__ == "__main__": threading.Thread(target = ComRecvDeal).start() #创建串口接收线程 td = pg.QtCore.QTimer() td.timeout.connect(addToDisplay) #定时刷新数据显示 td.start() app.exec_() 数据输入格式为: “字符串1,” 1234;“字符串2,” 2345;....“字符串n,” 3456;\n 数据输入不仅仅限制于串口,大家可灵活应用。 简单可靠但功能强大是我们梦寐以求。pyqtgraph功能极其强大,可用鼠标拖拉、放大,在应用界面上击右键可看到不少的设置功能,甚至包含FFT。 pyqtgraph简单的应用说明和pyqtgraph包的安装请看: <http://blog.csdn.net/qq_41590417/article/details/80277241> 如需提供串口数据源样板的,请招呼。为贪图方便我是用ARDUINO的。 相信大家用过之后会有很好的体验,但仍欢迎抛砖! |
| 很好的资料,非常感谢! |
微信公众号
手机版