Я беру данные из последовательного порта («COM» для Windows) и хочу сохранить их в CSV-файл и одновременно вывести на экран много графиков. Я думаю, что я должен использовать структуру данных для этого, но не уверен, какая из них подходит для меня, и, если возможно, не могли бы вы привести пример с этим? Также есть буфер и memoryview , но нет ни малейшего представления о том, как его использовать.
Я занимаюсь разработкой приложения, поэтому я использую wxpython с python 3. И для этого вместо использования thread, wxCallAfter или wxCallLater я использую только wx.Timer . Но когда я пробую эту структуру данных, которая является списком, через 20-30 секунд приложение заморозило , и они не выполняют свою работу одновременно. Любая помощь будет оценена.
import wx
import time
import serial
import matplotlib.pyplot as plt
import matplotlib.pyplot
import numpy as np
import matplotlib.animation as animation
ser = serial.Serial('COM9', 9600)
class MyForm(wx.Frame):
global ser,a,fig,ax,ax1,ax2
ser = serial.Serial('COM9',9600)
fig, ax = plt.subplots()
ax = plt.subplot(221) #sol ust GPS grafigi
ax1 = plt.subplot(212) #alt GPS-GLO grafigi
ax2 = plt.subplot(222) #sag ust GLO grafigi
a=[]
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "Timer Tutorial 2")
# Add a panel so it looks the correct on all platforms
panel = wx.Panel(self, wx.ID_ANY)
self.timer = wx.Timer(self, 1)
self.Bind(wx.EVT_TIMER, self.update1, self.timer)
self.timer2 = wx.Timer(self, 2)
self.Bind(wx.EVT_TIMER, self.update2, self.timer2)
self.timer3 = wx.Timer(self, 3)
self.Bind(wx.EVT_TIMER, self.update3, self.timer3)
self.timer4 = wx.Timer(self, 4)
self.Bind(wx.EVT_TIMER, self.update4, self.timer4)
self.toggleBtn = wx.Button(panel, wx.ID_ANY, "Start Timer 1")
self.toggleBtn.Bind(wx.EVT_BUTTON, self.Timer111)
self.toggleBtn2 = wx.Button(panel, wx.ID_ANY, "Start Timer 2")
self.toggleBtn2.Bind(wx.EVT_BUTTON, self.Timer222)
self.toggleBtn3 = wx.Button(panel, wx.ID_ANY, "Start Timer 3")
self.toggleBtn3.Bind(wx.EVT_BUTTON, self.Timer333)
self.toggleBtn4 = wx.Button(panel, wx.ID_ANY, "Start Timer 4")
self.toggleBtn4.Bind(wx.EVT_BUTTON, self.Timer444)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.toggleBtn, 0, wx.ALL|wx.CENTER, 5)
sizer.Add(self.toggleBtn2, 0, wx.ALL|wx.CENTER, 5)
sizer.Add(self.toggleBtn3, 0, wx.ALL|wx.CENTER, 5)
sizer.Add(self.toggleBtn4, 0, wx.ALL|wx.CENTER, 5)
panel.SetSizer(sizer)
def Timer111(self, event):
buttonObj = event.GetEventObject()
btnLabel = buttonObj.GetLabel()
timerNum = int(btnLabel[-1:])
print (timerNum)
if btnLabel == "Start Timer %s" % timerNum:
print ("starting timer 1...")
self.timer.Start(500)
buttonObj.SetLabel("Stop Timer %s" % timerNum)
else:
self.timer.Stop()
print ("timer 1 stopped!")
buttonObj.SetLabel("Start Timer %s" % timerNum)
def Timer222(self, event):
buttonObj = event.GetEventObject()
btnLabel = buttonObj.GetLabel()
timerNum = int(btnLabel[-1:])
print (timerNum)
if btnLabel == "Start Timer %s" % timerNum:
print ("starting timer 2...")
self.timer2.Start(1000)
buttonObj.SetLabel("Stop Timer %s" % timerNum)
else:
self.timer2.Stop()
plt.close()
print ("timer 2 stopped!")
buttonObj.SetLabel("Start Timer %s" % timerNum)
def Timer333(self, event):
buttonObj = event.GetEventObject()
btnLabel = buttonObj.GetLabel()
timerNum = int(btnLabel[-1:])
print (timerNum)
if btnLabel == "Start Timer %s" % timerNum:
print ("starting timer 3...")
self.timer3.Start(2000)
buttonObj.SetLabel("Stop Timer %s" % timerNum)
else:
self.timer3.Stop()
print ("timer 3 stopped!")
buttonObj.SetLabel("Start Timer %s" % timerNum)
def Timer444(self, event):
buttonObj = event.GetEventObject()
btnLabel = buttonObj.GetLabel()
timerNum = int(btnLabel[-1:])
print (timerNum)
if btnLabel == "Start Timer %s" % timerNum:
print ("starting timer 3...")
self.timer4.Start(3000)
buttonObj.SetLabel("Stop Timer %s" % timerNum)
else:
self.timer4.Stop()
print ("timer 4 stopped!")
buttonObj.SetLabel("Start Timer %s" % timerNum)
def update1(self, event):
global a
timerId = event.GetId()
if timerId == self.timer.GetId():
print("timer 1")
x=[]
x1=[]
x2=[]
y=[]
y1=[]
y2=[]
i=0
def altit(event):
for line in ser:
a.append(line)
#for item in a.__len__(): #orj: for line in ser #a.__sizeof__()-1
#for k in range(1000)
#for k in range(len(a)):
#print("item :", item)
#print("line: ",a[k])
data=line.split(b",")
if data[0] == b"$GNGGA":
altitude=data[9]
timm=data[1]
tim=float(timm)
tim=tim+30000
#print(tim)
hour = tim//10000
minute = (tim//100)%100
second = tim%100
zaman = hour*3600 + minute*60 + second
#print(zaman)
altitude=float(altitude)
x.append(zaman)
y.append(altitude)
ax.plot(x,y)
plt.ylabel('meters')
plt.xlabel('counts')
plt.title('ALTITUDE')
ani2 = animation.FuncAnimation(fig,altit)
plt.show()
print("hey")
def update2(self, event):
global ser,a,fig,ax,ax1,ax2
timerId = event.GetId()
if timerId == self.timer2.GetId():
print("timer 2")
print(a)
def update3(self, event):
timerId = event.GetId()
if timerId == self.timer3.GetId():
print("timer 3")
x=[]
x1=[]
x2=[]
y=[]
y1=[]
y2=[]
i=0
#fig = plt.figure()
def sV_sat(i):
for item in a:
data=item.split(b",")
if data[0] == b"$GPGSV":
print("c")
sView_GP = data[3]
sNumber_GP = data[4]
i=i+1
x.append(i)
#x=[i]
y.append(float(sView_GP))
ax.set_title("GPS")
ax1.set_title("GPS-GLO")
ax1.set_ylim(0,20)
ax.bar(i,y,color='green')
ax1.plot(x,y,'g')
ani8 = animation.FuncAnimation(fig,sV_sat)
plt.legend()
#pyplot.show()
plt.show()
def update4(self, event):
timerId = event.GetId()
if timerId == self.timer4.GetId():
print("timer 4")
#print (time.ctime())
# Run the program
if __name__ == "__main__":
app = wx.App()
frame = MyForm().Show()
app.MainLoop()
Я читаю и строю данные из def update1 и печатаю на экране с def update3 .