Various tips

しがない会社員の開発日記

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上でもインタラクティブに使えるようにします。
こんな感じです。
結局、引用先サイト様がすごいといったところです。