你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

功能强大却简单好用的串口数据图形化程序

[复制链接]
fanjiezz 发布时间:2019-6-17 23:02
    在嵌入式行业中,串口的多个数据可视化在工作中是经常要用的。除去在组态软件中应用较方便外,作为单独应用的也有几个。但要称得上有交互功能和实时功能的以前几乎没看到过。目前在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的。

    相信大家用过之后会有很好的体验,但仍欢迎抛砖!
收藏 1 评论1 发布时间:2019-6-17 23:02

举报

1个回答
瞻_ 回答时间:2019-6-21 08:51:18
很好的资料,非常感谢!

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版