python——基於pyqtgraph和下位機串列埠通訊並實現實時資料繪圖
阿新 • • 發佈:2021-01-25
技術標籤: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_()
實時效果展示
分別翻轉小車和轉動小車輪子