1. 程式人生 > 其它 >python——基於pyqtgraph和下位機串列埠通訊並實現實時資料繪圖

python——基於pyqtgraph和下位機串列埠通訊並實現實時資料繪圖

技術標籤:pythonMicropython視覺化python資料視覺化資料分析

想在上位機端實時調下位機的pid,所以需要看一下波形,拒絕盲調。同時使用pyqtgragh可以輕鬆地將資料進行動態視覺化。

文章目錄

環境準備

  • pyserial
pip install pyserial
  • pyqtgraph
pip install pyqtgraph
pip install PyQt5

串列埠通訊基本連線

import serial

ser = serial.Serial("COM3", 9600, timeout=
1, stopbits=1) if (ser.isOpen()): print("open success") # 向埠些資料 字串必須譯碼 ser.write("hello".encode()) while (True): line = ser.readline() if(line): print(line) line=0 else: print("open failed") ser.close()#關閉埠

串列埠動態引數視覺化

這裡採用pyqtgragh實現動態圖表的視覺化,只需加入串列埠讀取的程式碼即可。
想進一步瞭解和學習pyqtgraph具體使用方法的同學可以參考我的部落格:pyqtgragh——動態資料視覺化:繪製靜態和動態兩種資料曲線

在這裡我使用的的基於Micropython的pyboard進行上下位機的通訊,其實直接print就行,不需要UART傳送,我的傳送資料是一個元組格式的資料:
在這裡插入圖片描述
關於python和Micropython如何實現元組上位機通訊參考博文:適用於基於python或Micropython開發的上下位機間通訊的協議

  • PYB下位機串列埠列印的程式碼:
    在這裡插入圖片描述
  • 上位機PC端的程式碼:
import
pyqtgraph as pg import serial import time ''' 上下位USB通訊格式:元組 ''' def ser_plot(): start = time.time() global last_data data = ser.readline() data = data.decode("utf-8") data = str(data)[1:-3] # 將無關字元去除 “\n” 和 b'' 去除 try: data = eval(data) # 轉化回元組形式 except SyntaxError: data = last_data print(data) encoder = data[0] encoder_list.append(encoder[1]) plot1.setData(encoder_list, pen='g') accel = data[1] accel_list.append(accel[2]) plot2.setData(accel_list, pen='r') last_data = data end = time.time() print("cost:", end-start) if __name__ == '__main__': encoder_list = [] accel_list = [] last_data = 0 # serial初始化 ser = serial.Serial('COM3', 9600) if (ser.isOpen()): print("open success") else: print("open failed") # pyqtgragh初始化 # 建立視窗 app = pg.mkQApp() # 建立app win = pg.GraphicsWindow() # 建立視窗 win.setWindowTitle(u'pyqtgraph USB下位機串列埠波形顯示工具') win.resize(800, 500) # 小視窗大小 # 建立圖表 historyLength = 100 # 橫座標長度 p1 = win.addPlot() # 把圖p加入到視窗中 p1.showGrid(x=True, y=True) # 把X和Y的表格開啟 p1.setRange(xRange=[0, historyLength], yRange=[0, 100], padding=0) # x軸和y軸的範圍 p1.setLabel(axis='left', text='編碼器值') # 靠左 p1.setLabel(axis='bottom', text='時間') p1.setTitle('編碼器實時資料') # 表格的名字 plot1 = p1.plot() p2 = win.addPlot() # 把圖p加入到視窗中 p2.showGrid(x=True, y=True) # 把X和Y的表格開啟 p2.setRange(xRange=[0, historyLength], yRange=[0, 100], padding=0) p2.setLabel(axis='left', text='z') # 靠左 p2.setLabel(axis='bottom', text='時間') p2.setTitle('加速度計實時資料') # 表格的名字 plot2 = p2.plot() # 設定定時器 timer = pg.QtCore.QTimer() timer.timeout.connect(ser_plot) # 定時重新整理資料顯示 timer.start(40) # 多少ms呼叫一次 app.exec_()

實時效果展示

分別翻轉小車和轉動小車輪子
在這裡插入圖片描述