串行Python图eeg图

时间:2019-07-31 02:48:17

标签: python graph arduino-uno

我的意图是创建一个thing来读取数据并直接从串行端口(arduino)绘制实时图形,还可以进行自动扫描和连接。这是我必须使用arduino UNo读取EEG信号的项目。

“我曾经尝试调整代码,并尝试了一些使用matlab的方法,但在当前项目中Python更好。”

#!/usr/bin/env python3
###################################### 
# BRAINTECH PRIVATE LIMITED ??‍???‍???‍???‍??
# JOHN MELODY MELISSA                 
######################################     
#         
# All rights reserved © 2019 BRAINTECH.
######################################
from threading import Thread
import serial
import time
import collections
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import struct
import copy
import pandas as pd
import serial.tools.list_ports


class serialPlot:
   # x = [0, 500, 1000]
   #  y = [-1000, -500, 0, 500, 1000]
    def get_ports():
        ports = serial.tools.list_ports.comports()
        return ports

    #def findArduino(portsFound):
    #   comPort = "None"
    #    numConnection = len(portsFound)

    #    for i in range(0, numConnection):
    #        port = foundPorts[i]
    #        strPort = str(port)
    #        if "Arduino" in strPort:
    #            splitPort = strPort.split(" ")
    #            comPort = (splitPort[0])

    def __init__(self, serialPort='COM4', serialBaud=115200, plotLength=10, dataNumBytes=3, numPlots=10):
        self.port = serialPort
        self.baud = serialBaud
        self.plotMaxLength = plotLength
        self.dataNumBytes = dataNumBytes
        self.numPlots = numPlots
        self.rawData = bytearray(numPlots * dataNumBytes)
        self.dataType = None
        if dataNumBytes == 8:
            self.dataType = 'h'     # 2 byte integer
        elif dataNumBytes == 4:
            self.dataType = 'f'     # 4 byte float
        self.data = []
        for i in range(numPlots):   # give an array for each type of data and store them in a list
            self.data.append(collections.deque([0] * plotLength, maxlen=plotLength))
        self.isRun = True
        self.isReceiving = True
        self.thread = None
        self.plotTimer = 0
        self.previousTimer = 0
        # self.csvData = []

        print('Trying to connect to: ' + str(serialPort) + ' at ' + str(serialBaud) + ' BAUD.')
        try:
            self.serialConnection = serial.Serial(serialPort, serialBaud, timeout=4)
            print('Connected to ' + str(serialPort) + ' at ' + str(serialBaud) + ' BAUD.')
        except:
            print("Failed to connect with " + str(serialPort) + ' at ' + str(serialBaud) + ' BAUD.')

    def readSerialStart(self):
        if self.thread == None:
            self.thread = Thread(target=self.backgroundThread)
            self.thread.start()
            # Block till we start receiving values
            while self.isReceiving != True:
                time.sleep(0.1)

    def getSerialData(self, frame, lines, lineValueText, lineLabel, timeText):
        currentTimer = time.perf_counter()
        self.plotTimer = int((currentTimer - self.previousTimer) * 100)     # the first reading will be erroneous
        self.previousTimer = currentTimer
        timeText.set_text('Plot Interval = ' + str(self.plotTimer) + 'ms')
        privateData = copy.deepcopy(self.rawData[:])    # so that the 3 values in our plots will be synchronized to the same sample time
        for i in range(self.numPlots):
            data = privateData[(i*self.dataNumBytes):(self.dataNumBytes + i*self.dataNumBytes)]
            value,  = struct.unpack(self.dataType, data)
            self.data[i].append(value)    # we get the latest data point and append it to our array
            lines[i].set_data(range(self.plotMaxLength), self.data[i])
            lineValueText[i].set_text('[' + lineLabel[i] + '] = ' + str(value))
        # self.csvData.append([self.data[0][-1], self.data[1][-1], self.data[2][-1]])

    def backgroundThread(self):    # retrieve data
        time.sleep(1.0)  # give some buffer time for retrieving data
        #self.serialConnection.reset_input_buffer()
        while (self.isRun):
            self.serialConnection.readinto(self.rawData)
            self.isReceiving = True
            print(self.rawData)

    def close(self):
        self.isRun = False
        self.thread.join()
        self.serialConnection.close()
        print('Disconnected...')
        # df = pd.DataFrame(self.csvData)
        # df.to_csv('/home/rikisenia/Desktop/data.csv')  ############


def main():
    # portName = 'COM5'
    portName = 'COM4'
    baudRate = 115200
    maxPlotLength = 10    # number of points in x-axis of real time plot
    dataNumBytes = 4        # number of bytes of 1 data point
    numPlots = 3            # number of plots in 1 graph
    s = serialPlot(portName, baudRate, maxPlotLength, dataNumBytes, numPlots)   # initializes all required variables
    s.readSerialStart()                                               # starts background thread

    # plotting starts below
    pltInterval = 50    # Period at which the plot animation updates [ms]
    xmin = 0
    xmax = maxPlotLength
    ymin = -(400)
    ymax = 500
    fig = plt.figure(figsize=(10, 8))
    ax = plt.axes(xlim=(xmin, xmax), ylim=(float(ymin - (ymax - ymin) /10), float(ymax + (ymax - ymin) / -10)))
    ax.set_title('LIVE GRAPH--EEG')
    ax.set_xlabel("Time")
    ax.set_ylabel("DATA")

    lineLabel = ['X', 'Y', 'Z']
    style = ['r-', 'c-', 'b-']  # linestyles for the different plots
    timeText = ax.text(0.70, 0.95, '', transform=ax.transAxes)
    lines = []
    lineValueText = []
    for i in range(numPlots):
        lines.append(ax.plot([], [], style[i], label=lineLabel[i])[0])
        lineValueText.append(ax.text(0.70, 0.90-i*0.05, '', transform=ax.transAxes))
    anim = animation.FuncAnimation(fig, s.getSerialData, fargs=(lines, lineValueText, lineLabel, timeText), interval=pltInterval)    # fargs has to be a tuple

    plt.legend(loc="upper left")
    plt.show()

    s.close()


if __name__ == '__main__':
    main()

我希望协议是 A5 5A 02 39 02 33 01 EB 02 22 01 B3 02 00 02 00 0F

但是我收到的只是:

tearray(b'\x02\x00\x02\x00\x02\x00\x02\x00\xf0\xa5Z\x02')
bytearray(b'`\x01t\x01\x00\x02\x00\x02\x00\x02\x00\x02')
bytearray(b'\x00\xf0\xa5Z\x02a\x01w\x01\x00\x02\x00')
bytearray(b'\x02\x00\x02\x00\x02\x00\xf0\xa5Z\x02b\x01')
bytearray(b'w\x01\x00\x02\x00\x02\x00\x02\x00\x02\x00\xf0')
bytearray(b'\xa5Z\x02c\x01w\x01\x00\x02\x00\x02\x00')
bytearray(b'\x02\x00\x02\x00\xf0\xa5Z\x02d\x01w\x01')
bytearray(b'\x00\x02\x00\x02\x00\x02\x00\x02\x00\xf0\xa5Z')
bytearray(b'\x02e\x01w\x01\x00\x02\x00\x02\x00\x02\x00')
bytearray(b'\x02\x00\xf0\xa5Z\x02f\x01t\x01\x00\x02')
bytearray(b'\x00\x02\x00\x02\x00\x02\x00\xf0\xa5Z\x02g')
bytearray(b'\x01t\x01\x00\x02\x00\x02\x00\x02\x00\x02\x00')
bytearray(b'\xf0\xa5Z\x02h\x01q\x01\x00\x02\x00\x02')
bytearray(b'\x00\x02\x00\x02\x00\xf0\xa5Z\x02i\x01t')
bytearray(b'\x01\x00\x02\x00\x02\x00\x02\x00\x02\x00\xf0\xa5')
bytearray(b'Z\x02j\x01t\x01\x00\x02\x00\x02\x00\x02')
bytearray(b'\x00\x02\x00\xf0\xa5Z\x02k\x01t\x01\x00')
bytearray(b'\x02\x00\x02\x00\x02\x00\x02\x00\xf0\xa5Z\x02')
bytearray(b'l\x01q\x01\x00\x02\x00\x02\x00\x02\x00\x02')
bytearray(b'\x00\xf0\xa5Z\x02m\x01q\x01\x00\x02\x00')
bytearray(b'\x02\x00\x02\x00\x02\x00\xf0\xa5Z\x02n\x01')
bytearray(b'q\x01\x00\x02\x00\x02\x00\x02\x00\x02\x00\xf0')
bytearray(b'\xa5Z\x02o\x01q\x01\x00\x02\x00\x02\x00')
bytearray(b'\x02\x00\x02\x00\xf0\xa5Z\x02p\x01t\x01')
bytearray(b'\x00\x02\x00\x02\x00\x02\x00\x02\x00\xf0\xa5Z')
bytearray(b'\x02q\x01w\x01\x00\x02\x00\x02\x00\x02\x00')
bytearray(b'\x02\x00\xf0\xa5Z\x02r\x01w\x01\x00\x02')
bytearray(b'\x00\x02\x00\x02\x00\x02\x00\xf0\xa5Z\x02s')
bytearray(b'\x01w\x01\x00\x02\x00\x02\x00\x02\x00\x02\x00')
bytearray(b'\xf0\xa5Z\x02t\x01w\x01\x00\x02\x00\x02')
bytearray(b'\x00\x02\x00\x02\x00\xf0\xa5Z\x02u\x01w')
bytearray(b'\x01\x00\x02\x00\x02\x00\x02\x00\x02\x00\xf0\xa5')
bytearray(b'Z\x02v\x01w\x01\x00\x02\x00\x02\x00\x02')
bytearray(b'\x00\x02\x00\xf0\xa5Z\x02w\x01w\x01\x00')
bytearray(b'\x02\x00\x02\x00\x02\x00\x02\x00\xf0\xa5Z\x02')
bytearray(b'x\x01w\x01\x00\x02\x00\x02\x00\x02\x00\x02')
bytearray(b'\x00\xf0\xa5Z\x02y\x01z\x01\x00\x02\x00')
bytearray(b'\x02\x00\x02\x00\x02\x00\xf0\xa5Z\x02z\x01')
bytearray(b'z\x01\x00\x02\x00\x02\x00\x02\x00\x02\x00\xf0')
bytearray(b'\xa5Z\x02{\x01z\x01\x00\x02\x00\x02\x00')
bytearray(b'\x02\x00\x02\x00\xf0\xa5Z\x02|\x01}\x01')
bytearray(b'\x00\x02\x00\x02\x00\x02\x00\x02\x00\xf0\xa5Z')
bytearray(b'\x02}\x01z\x01\x00\x02\x00\x02\x00\x02\x00')
bytearray(b'\x02\x00\xf0\xa5Z\x02~\x01z\x01\x00\x02')
bytearray(b'\x00\x02\x00\x02\x00\x02\x00\xf0\xa5Z\x02\x7f')
bytearray(b'\x01z\x01\x00\x02\x00\x02\x00\x02\x00\x02\x00')
bytearray(b'\xf0\xa5Z\x02\x80\x01z\x01\x00\x02\x00\x02')
bytearray(b'\x00\x02\x00\x02\x00\xf0\xa5Z\x02\x81\x01z')
bytearray(b'\x01\x00\x02\x00\x02\x00\x02\x00\x02\x00\xf0\xa5')
bytearray(b'Z\x02\x82\x01z\x01\x00\x02\x00\x02\x00\x02')
bytearray(b'\x00\x02\x00\xf0\xa5Z\x02\x83\x01w\x01\x00')
bytearray(b'\x02\x00\x02\x00\x02\x00\x02\x00\xf0\xa5Z\x02')
bytearray(b'\x84\x01t\x01\x00\x02\x00\x02\x00\x02\x00\x02')
bytearray(b'\x00\xf0\xa5Z\x02\x85\x01q\x01\x00\x02\x00')
bytearray(b'\x02\x00\x02\x00\x02\x00\xf0\xa5Z\x02\x86\x01')
bytearray(b'n\x01\x00\x02\x00\x02\x00\x02\x00\x02\x00\xf0')
bytearray(b'\xa5Z\x02\x87\x01n\x01\x00\x02\x00\x02\x00')
bytearray(b'\x02\x00\x02\x00\xf0\xa5Z\x02\x88\x01t\x01')
bytearray(b'\x00\x02\x00\x02\x00\x02\x00\x02\x00\xf0\xa5Z')
bytearray(b'\x02\x89\x01w\x01\x00\x02\x00\x02\x00\x02\x00')
bytearray(b'\x02\x00\xf0\xa5Z\x02\x8a\x01w\x01\x00\x02')
bytearray(b'\x00\x02\x00\x02\x00\x02\x00\xf0\xa5Z\x02\x8b')
bytearray(b'\x01z\x01\x00\x02\x00\x02\x00\x02\x00\x02\x00')
bytearray(b'\xf0\xa5Z\x02\x8c\x01}\x01\x00\x02\x00\x02')
bytearray(b'\x00\x02\x00\x02\x00\xf0\xa5Z\x02\x8d\x01z')
bytearray(b'\x01\x00\x02\x00\x02\x00\x02\x00\x02\x00\xf0\xa5')
bytearray(b'Z\x02\x8e\x01w\x01\x00\x02\x00\x02\x00\x02')
bytearray(b'\x00\x02\x00\xf0\xa5Z\x02\x8f\x01w\x01\x00')
bytearray(b'\x02\x00\x02\x00\x02\x00\x02\x00\xf0\xa5Z\x02')
bytearray(b'\x90\x01w\x01\x00\x02\x00\x02\x00\x02\x00\x02')
bytearray(b'\x00\xf0\xa5Z\x02\x91\x01w\x01\x00\x02\x00')
bytearray(b'\x02\x00\x02\x00\x02\x00\xf0\xa5Z\x02\x92\x01')
bytearray(b'w\x01\x00\x02\x00\x02\x00\x02\x00\x02\x00\xf0')
bytearray(b'\xa5Z\x02\x93\x01w\x01\x00\x02\x00\x02\x00')
bytearray(b'\x02\x00\x02\x00\xf0\xa5Z\x02\x94\x01z\x01')
bytearray(b'\x00\x02\x00\x02\x00\x02\x00\x02\x00\xf0\xa5Z')
bytearray(b'\x02\x95\x01z\x01\x00\x02\x00\x02\x00\x02\x00')
bytearray(b'\x02\x00\xf0\xa5Z\x02\x96\x01w\x01\x00\x02')
bytearray(b'\x00\x02\x00\x02\x00\x02\x00\xf0\xa5Z\x02\x97')
bytearray(b'\x01w\x01\x00\x02\x00\x02\x00\x02\x00\x02\x00')
bytearray(b'\xf0\xa5Z\x02\x98\x01w\x01\x00\x02\x00\x02')
bytearray(b'\x00\x02\x00\x02\x00\xf0\xa5Z\x02\x99\x01w')
bytearray(b'\x01\x00\x02\x00\x02\x00\x02\x00\x02\x00\xf0\xa5')
bytearray(b'Z\x02\x9a\x01w\x01\x00\x02\x00\x02\x00\x02')
bytearray(b'\x00\x02\x00\xf0\xa5Z\x02\x9b\x01w\x01\x00')
bytearray(b'\x02\x00\x02\x00\x02\x00\x02\x00\xf0\xa5Z\x02')
bytearray(b'\x9c\x01w\x01\x00\x02\x00\x02\x00\x02\x00\x02')
bytearray(b'\x00\xf0\xa5Z\x02\x9d\x01w\x01\x00\x02\x00')
bytearray(b'\x02\x00\x02\x00\x02\x00\xf0\xa5Z\x02\x9e\x01')
bytearray(b'w\x01\x00\x02\x00\x02\x00\x02\x00\x02\x00\xf0')
bytearray(b'\xa5Z\x02\x9f\x01w\x01\x00\x02\x00\x02\x00')
bytearray(b'\x02\x00\x02\x00\xf0\xa5Z\x02\xa0\x01w\x01')
bytearray(b'\x00\x02\x00\x02\x00\x02\x00\x02\x00\xf0\xa5Z')
bytearray(b'\x02\xa1\x01z\x01\x00\x02\x00\x02\x00\x02\x00')
bytearray(b'\x02\x00\xf0\xa5Z\x02\xa2\x01z\x01\x00\x02')
bytearray(b'\x00\x02\x00\x02\x00\x02\x00\xf0\xa5Z\x02\xa3')
bytearray(b'\x01}\x01\x00\x02\x00\x02\x00\x02\x00\x02\x00')
bytearray(b'\xf0\xa5Z\x02\xa4\x01z\x01\x00\x02\x00\x02')
bytearray(b'\x00\x02\x00\x02\x00\xf0\xa5Z\x02\xa5\x01z')
bytearray(b'\x01\x00\x02\x00\x02\x00\x02\x00\x02\x00\xf0\xa5')
bytearray(b'Z\x02\xa6\x01w\x01\x00\x02\x00\x02\x00\x02')
bytearray(b'\x00\x02\x00\xf0\xa5Z\x02\xa7\x01w\x01\x00')
bytearray(b'\x02\x00\x02\x00\x02\x00\x02\x00\xf0\xa5Z\x02')
bytearray(b'\xa8\x01t\x01\x00\x02\x00\x02\x00\x02\x00\x02')
bytearray(b'\x00\xf0\xa5Z\x02\xa9\x01t\x01\x00\x02\x00')
bytearray(b'\x02\x00\x02\x00\x02\x00\xf0\xa5Z\x02\xaa\x01')
bytearray(b'q\x01\x00\x02\x00\x02\x00\x02\x00\x02\x00\xf0')
bytearray(b'\xa5Z\x02\xab\x01q\x01\x00\x02\x00\x02\x00')
bytearray(b'\x02\x00\x02\x00\xf0\xa5Z\x02\xac\x01t\x01')
bytearray(b'\x00\x02\x00\x02\x00\x02\x00\x02\x00\xf0\xa5Z')
bytearray(b'\x02\xad\x01w\x01\x00\x02\x00\x02\x00\x02\x00')
bytearray(b'\x02\x00\xf0\xa5Z\x02\xae\x01z\x01\x00\x02')
bytearray(b'\x00\x02\x00\x02\x00\x02\x00\xf0\xa5Z\x02\xaf')
bytearray(b'\x01}\x01\x00\x02\x00\x02\x00\x02\x00\x02\x00')
bytearray(b'\xf0\xa5Z\x02\xb0\x01\x80\x01\x00\x02\x00\x02')
bytearray(b'\x00\x02\x00\x02\x00\xf0\xa5Z\x02\xb1\x01\x80')
bytearray(b'\x01\x00\x02\x00\x02\x00\x02\x00\x02\x00\xf0\xa5')
bytearray(b'Z\x02\xb2\x01\x80\x01\x00\x02\x00\x02\x00\x02')
bytearray(b'\x00\x02\x00\xf0\xa5Z\x02\xb3\x01\x80\x01\x00')
bytearray(b'\x02\x00\x02\x00\x02\x00\x02\x00\xf0\xa5Z\x02')
bytearray(b'\xb4\x01\x80\x01\x00\x02\x00\x02\x00\x02\x00\x02')
bytearray(b'\x00\xf0\xa5Z\x02\xb5\x01\x80\x01\x00\x02\x00')
bytearray(b'\x02\x00\x02\x00\x02\x00\xf0\xa5Z\x02\xb6\x01')
bytearray(b'\x80\x01\x00\x02\x00\x02\x00\x02\x00\x02\x00\xf0')
bytearray(b'\xa5Z\x02\xb7\x01\x80\x01\x00\x02\x00\x02\x00')
bytearray(b'\x02\x00\x02\x00\xf0\xa5Z\x02\xb8\x01\x80\x01')
bytearray(b'\x00\x02\x00\x02\x00\x02\x00\x02\x00\xf0\xa5Z')
bytearray(b'\x02\xb9\x01\x80\x01\x00\x02\x00\x02\x00\x02\x00')
bytearray(b'\x02\x00\xf0\xa5Z\x02\xba\x01\x80\x01\x00\x02')
bytearray(b'\x00\x02\x00\x02\x00\x02\x00\xf0\xa5Z\x02\xbb')
bytearray(b'\x01\x80\x01\x00\x02\x00\x02\x00\x02\x00\x02\x00')
bytearray(b'\xf0\xa5Z\x02\xbc\x01}\x01\x00\x02\x00\x02')
bytearray(b'\x00\x02\x00\x02\x00\xf0\xa5Z\x02\xbd\x01}')
bytearray(b'\x01\x00\x02\x00\x02\x00\x02\x00\x02\x00\xf0\xa5')
bytearray(b'Z\x02\xbe\x01}\x01\x00\x02\x00\x02\x00\x02')
bytearray(b'\x00\x02\x00\xf0\xa5Z\x02\xbf\x01}\x01\x00')
bytearray(b'\x02\x00\x02\x00\x02\x00\x02\x00\xf0\xa5Z\x02')
bytearray(b'\xc0\x01}\x01\x00\x02\x00\x02\x00\x02\x00\x02')
bytearray(b'\x00\xf0\xa5Z\x02\xc1\x01}\x01\x00\x02\x00')
bytearray(b'\x02\x00\x02\x00\x02\x00\xf0\xa5Z\x02\xc2\x01')
bytearray(b'}\x01\x00\x02\x00\x02\x00\x02\x00\x02\x00\xf0')
bytearray(b'\xa5Z\x02\xc3\x01}\x01\x00\x02\x00\x02\x00')
bytearray(b'\x02\x00\x02\x00\xf0\xa5Z\x02\xc4\x01}\x01')
bytearray(b'\x00\x02\x00\x02\x00\x02\x00\x02\x00\xf0\xa5Z')
bytearray(b'\x02\xc5\x01}\x01\x00\x02\x00\x02\x00\x02\x00')
bytearray(b'\x02\x00\xf0\xa5Z\x02\xc6\x01}\x01\x00\x02')
bytearray(b'\x00\x02\x00\x02\x00\x02\x00\xf0\xa5Z\x02\xc7')
bytearray(b'\x01}\x01\x00\x02\x00\x02\x00\x02\x00\x02\x00')
bytearray(b'\xf0\xa5Z\x02\xc8\x01}\x01\x00\x02\x00\x02')
bytearray(b'\x00\x02\x00\x02\x00\xf0\xa5Z\x02\xc9\x01}')
bytearray(b'\x01\x00\x02\x00\x02\x00\x02\x00\x02\x00\xf0\xa5')
bytearray(b'Z\x02\xca\x01z\x01\x00\x02\x00\x02\x00\x02')
bytearray(b'\x00\x02\x00\xf0\xa5Z\x02\xcb\x01z\x01\x00')
bytearray(b'\x02\x00\x02\x00\x02\x00\x02\x00\xf0\xa5Z\x02')
bytearray(b'\xcc\x01z\x01\x00\x02\x00\x02\x00\x02\x00\x02')
bytearray(b'\x00\xf0\xa5Z\x02\xcd\x01z\x01\x00\x02\x00')

许多帮助将不胜感激。提前谢谢您,天才! <3

0 个答案:

没有答案