PySerialのデータをリアルタイムで見たい
visual studio使いたくないし、どうにかjupyterでどうにかならないかなあと思った矢先以下のサイト様にコードが
takeshid.hatenadiary.jp
ありがたいありがたい。。。
転記の様に使っていいのかわからないですが、上記のサイト様のをベースにUARTシリアル通信バージョンを組んでみました。
# -*- coding:utf-8 -*- %gui qt #プロット関係のライブラリ import pyqtgraph as pg from pyqtgraph.Qt import QtCore, QtGui import numpy as np import serial import sys class PlotWindow: def __init__(self): #プロット初期設定 self.win=pg.GraphicsWindow() self.win.setWindowTitle(u"リアルタイムプロット") self.plt=self.win.addPlot() #プロットのビジュアル関係 self.plt.setYRange(-1,70000) #y軸の上限、下限の設定 self.curve=self.plt.plot() #プロットデータを入れる場所 self.ser = serial.Serial(port="COM3",baudrate=115200) #アップデート時間設定 self.timer=QtCore.QTimer() self.timer.timeout.connect(self.update) self.timer.start(10) #10msごとにupdateを呼び出し #UART受信データ(data) self.data=[0] def update(self): #データの読み取り ReceData = self.ser.read(2) #16進数2桁のデータ2つを一気にデコード ReceData = np.frombuffer(ReceData,dtype=np.uint8) self.data.append(256*ReceData[0]+ReceData[1]) self.curve.setData(self.data) #プロットデータを格納 #self.ser.write(bytearray([70])) #デバック用送信器 if __name__=="__main__": plotwin=PlotWindow() if (sys.flags.interactive!=1) or not hasattr(QtCore, 'PYQT_VERSION'): QtGui.QApplication.instance().exec_()
GUI部分に関しては引用先サイト様にお任せして、シリアルのことをちょっと書いておきます。
環境はwindows10を使って動作させています。
ので、serial.Serial(port="COM3"... と、portにはこのような形で指定しています。
ubuntuとかだと、port="/dev/ttyACM0"みたいな感じになるかと。
また、今回はstm32f401reを使ってUART越しにPCへデータを送信しています。
送られてくるデータは16進数2桁のデータなのでそれをnumpyを用いてデコードします。エンディアン化させているので2つ同時に送られてくるので余計にnp.frombufferがすごいよい働きをしてくれます。(生データを直接引数にして10進数に直してくれるため。)
また、jupyter上での設定として、
%gui qt
を書いておいてあげると、notebook上でもインタラクティブに使えるようにします。
こんな感じです。
結局、引用先サイト様がすごいといったところです。