|
在嵌入式行业中,串口的多个数据可视化在工作中是经常要用的。除去在组态软件中应用较方便外,作为单独应用的也有几个。但要称得上有交互功能和实时功能的以前几乎没看到过。目前在pyqtgraph的应用中这些功能的实施已不再是高不可攀了。最近看到的一个实例相信肯定会让我们眼前一亮,不敢独享。博客地址如下:/ v# Z% ^+ s! R* Y% R6 K <http://blog.csdn.net/u013555402/article/details/85124452>; J( N: Q) K5 [. Z& ^5 ` 该作者的功力了得,且施惠与众人。非常值得敬佩! 本文参考上述博客,针对一般场合的应用在如下几个方面精简、改进。" `' c$ D& u" _( u9 S" @: A1 S 1.适应整数数据输入(需输入浮点数据的请不用再看下去了)/ _0 B% |6 K4 R; h python的诟病是速度不快。我们平时用的数据有许多是可归一化为整数的,连numpy都可以不用了,以加快程序的运行速度,更好的适应实时化需求。, j2 |" N9 V5 N/ p/ e( S3 q+ r6 ? 2.输入数据的出错处理 数据的第一行输入极有可能不完整,扔掉。7 t! D$ p- H- s0 K Y) j 3.简化程序" x, i0 U2 b% e$ [6 ^1 U 如果串口号、输入数据及格式都正常时,该程序运行非常稳定。因此去掉了一些出错处理语句。% o! j8 o" J( L( p+ K& |" j5 k4 n 4.改善x轴抖动 当采样数据的个数与最大显示限制个数相同时,x轴会抖动。增加2个采样数据时,即可避免该抖动。 代码如下:(Python 3.4) import array,serial,re,threading import pyqtgraph as pg' k5 t+ \# o% B1 [0 Y1 `! Q# M. \ app = pg.mkQApp() win = pg.GraphicsWindow()5 K. P/ g% P" ^( D4 y, O win.setWindowTitle(u'AD波形显示')& w& K. @& W& d, ] p = win.addPlot() #win.addPlot()添加一个波形窗口,多次调用会将窗口分成多个界面 , S8 |; c+ [; k& X data_dict = {} #存放所有收到的数据 p.addLegend() #在plot前调用显示图例 Max_count_1 = 500 #页面数据个数$ m7 Z! a6 m5 l/ @- z) k Max_count_2 = Max_count_1 + 2 #避免X轴抖动 color = ['b','g','r', 'c','m','y', 'k','w'] #线的颜色表 ser = serial.Serial('com18',115200) #请自己修改成相应的串口号和波特率 ser.readline() #第一行的数据极有可能不完整,扔掉 7 J& Y$ A7 B. Y0 _ def ComRecvDeal(): while(True): line = ser.readline().decode() #line是bytes格式,转成字符串 ***. }0 T! f- h; o1 ` line = line.split("\\n") #去除最后的\n换行 str str_arr = line[0].split(';') #list *** str_arr.pop() for a in str_arr:2 j2 `: u0 p7 F2 D" D: L5 d* |0 Z4 F8 { s = a.split(',') name ,val = s[0], int(s[1]) #提取名称和数据部分, Q! C+ O3 N3 s+ ` if(data_dict.get(name) == None): #判断是否存在添加当前键值,None则需要添加键值 *** #curve = p.plot(pen = color[len(data_dict)],name = name,symbolBrush = color[len(data_dict)])) ?" Z7 e9 z. e" _ #为新的变量添加新的曲线,显示数据点 curve = p.plot(pen = color[len(data_dict)],name = name) #为新的变量添加新的曲线* i5 X8 y6 n& i5 U9 p- E9 e5 Z3 R8 C data_dict[name] = [curve] #在字典中添加当前键值,并赋值曲线,字典数据格式{key:[curve,[dadta1,data2,...]]} data_dict[name].append([val]) #将当前数据已列表的形式添加到字典对象中 else: #键值存在直接添加到对应的数据部分 if(len(data_dict[s[0]][1]) == Max_count_2):. ~2 ^; d% X9 F+ h7 ~ 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); z% b. t {3 r2 A5 D* @ . X. I. {* N9 o/ Z _ def addToDisplay(): for i in data_dict.items():2 Z+ O4 Z% }5 @8 x+ G5 i6 M4 g data ,curve = i[1][1], i[1][0]$ |9 r) F7 m# V* h) G$ t$ \# ^5 ` data = data[( -Max_count_1):] if(len(data) > Max_count_1) else data[:]! _" _" m& T' j1 e% Y' ~! W curve.setData(data) #添加数据显示 1 Z% ?) ^" u' N/ n4 y if __name__ == "__main__": threading.Thread(target = ComRecvDeal).start() #创建串口接收线程 ; A1 t* ~. x6 A! W6 |" b: A. P td = pg.QtCore.QTimer()% r' e, w0 a: v" O! G- M td.timeout.connect(addToDisplay) #定时刷新数据显示% G& E+ _ a. w3 {- V! j" U td.start() app.exec_()2 V% p/ E; @$ }( F; W- P# k D3 V9 q 0 o# I) N2 i7 w( ?# c7 _ 数据输入格式为:6 ~, z0 V# n0 w3 d( n# p& j# W2 z" o% W “字符串1,” 1234;“字符串2,” 2345;....“字符串n,” 3456;\n7 Y- L; g9 k, P9 F, i0 v 数据输入不仅仅限制于串口,大家可灵活应用。5 b' j. r6 t( O7 k, d 简单可靠但功能强大是我们梦寐以求。pyqtgraph功能极其强大,可用鼠标拖拉、放大,在应用界面上击右键可看到不少的设置功能,甚至包含FFT。 pyqtgraph简单的应用说明和pyqtgraph包的安装请看: <http://blog.csdn.net/qq_41590417/article/details/80277241> 如需提供串口数据源样板的,请招呼。为贪图方便我是用ARDUINO的。 0 E/ I( e4 P2 c" n4 [0 h, z- g1 E 相信大家用过之后会有很好的体验,但仍欢迎抛砖!/ X# B, Q2 K7 ^% H |
| 很好的资料,非常感谢! |
微信公众号
手机版