我的意图是创建一个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