Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import threading
- import time
- import tkinter
- from tkinter import ttk
- import serial
- import serial.tools.list_ports
- from serial.tools.list_ports_windows import iterate_comports
- import matplotlib.pyplot as plt
- from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
- class TkGUI(threading.Thread):
- working = False
- receiver = None
- ports = []
- ports_description = []
- def __init__(self):
- threading.Thread.__init__(self)
- def get_ports(self):
- self.ports = [p.device for p in list(iterate_comports())]
- self.com_combobox['values'] = [p.device + " - " + p.description for p in list(iterate_comports())]
- def save(self):
- f = tkinter.filedialog.asksaveasfile(mode='w', defaultextension=".png")
- # Вставить проверку f
- #self.plot()
- #self.fig.savefig(f)
- def close(self):
- self.root.quit()
- def start_stop(self):
- if self.working:
- self.receiver.stop_receive()
- self.button_start_stop.configure(text=u"Пуск")
- self.working = False
- else:
- self.receiver.start_receive("COM1", 115200)
- self.rec_count_label.set(0)
- self.button_start_stop.configure(text=u"Стоп")
- self.working = True
- def plot(self, data):
- print("plot data len: ", len(data))
- def run(self):
- self.root = tkinter.Tk()
- self.root.protocol("WM_DELETE_WINDOW", self.close)
- frame_left = ttk.Frame(self.root)
- frame_right = ttk.Frame(self.root)
- # Левая часть
- frame_Count = ttk.Frame(frame_left)
- frame_Count_l1 = ttk.Label(frame_Count, text=u"Принято: ")
- self.rec_count_label = tkinter.StringVar()
- self.rec_count_label.set(0)
- frame_Count_l2 = ttk.Label(frame_Count, textvariable=self.rec_count_label)
- frame_Count_l1.pack(side="left")
- frame_Count_l2.pack(side="left")
- self.button_start_stop = ttk.Button(frame_left, text=u"Пуск", command=self.start_stop)
- self.com_combobox = ttk.Combobox(frame_left, width=30)
- self.get_ports()
- frame_Count.pack(side="top", anchor="nw", padx=2, pady=2)
- self.com_combobox.pack(side="top", anchor="nw", padx=2, pady=2)
- self.button_start_stop.pack(side="top", anchor="nw", padx=2, pady=2)
- # График
- self.fig = plt.Figure(figsize=(10, 8))
- self.canvas = FigureCanvasTkAgg(self.fig, master=self.root)
- self.canvas.show()
- self.canvas_plot = self.canvas.get_tk_widget()
- # Правая часть
- frame_right_l1 = ttk.Label(frame_right, text=u"--==~~~~~==--")
- self.minT = tkinter.StringVar()
- self.minT.set("0")
- frame_minT = ttk.Frame(frame_right)
- ttk.Label(frame_minT, text="min T ").pack(side="left")
- ttk.Entry(frame_minT, textvariable=self.minT).pack(side="left")
- self.maxT = tkinter.StringVar()
- self.maxT.set("100")
- frame_maxT = ttk.Frame(frame_right)
- ttk.Label(frame_maxT, text="max T ").pack(side="left")
- ttk.Entry(frame_maxT, textvariable=self.maxT).pack(side="left")
- self.stepT = tkinter.StringVar()
- self.stepT.set("10")
- frame_stepT = ttk.Frame(frame_right)
- ttk.Label(frame_stepT, text="step T ").pack(side="left")
- ttk.Entry(frame_stepT, textvariable=self.stepT).pack(side="left")
- self.minY = tkinter.StringVar()
- self.minY.set("-8000")
- frame_minY = ttk.Frame(frame_right)
- ttk.Label(frame_minY, text="min Y ").pack(side="left")
- ttk.Entry(frame_minY, textvariable=self.minY).pack(side="left")
- self.maxY = tkinter.StringVar()
- self.maxY.set("8000")
- frame_maxY = ttk.Frame(frame_right)
- ttk.Label(frame_maxY, text="max Y ").pack(side="left")
- ttk.Entry(frame_maxY, textvariable=self.maxY).pack(side="left")
- self.stepY = tkinter.StringVar()
- self.stepY.set("1000")
- frame_stepY = ttk.Frame(frame_right)
- ttk.Label(frame_stepY, text="step Y ").pack(side="left")
- ttk.Entry(frame_stepY, textvariable=self.stepY).pack(side="left")
- frame_right_l1.pack(side="top", anchor="nw", padx=2, pady=2)
- frame_minT.pack(side="top", anchor="nw", padx=2, pady=2)
- frame_maxT.pack(side="top", anchor="nw", padx=2, pady=2)
- frame_stepT.pack(side="top", anchor="nw", padx=2, pady=2)
- frame_minY.pack(side="top", anchor="nw", padx=2, pady=2)
- frame_maxY.pack(side="top", anchor="nw", padx=2, pady=2)
- frame_stepY.pack(side="top", anchor="nw", padx=2, pady=2)
- self.button_square = tkinter.BooleanVar()
- self.button_square.set("false")
- checkbutton_square = ttk.Checkbutton(frame_right, text=u"сумма квадратов", variable=self.button_square)
- button_refresh = ttk.Button(frame_right, text=u"Перерисовать", command=self.plot)
- button_save = ttk.Button(frame_right, text=u"Сохранить изображение", command=self.save)
- frame_left.pack(side="left", padx=10, pady=10, anchor="n")
- self.canvas_plot.pack(side="left", anchor="n", expand="true")
- frame_right.pack(side="left", padx=10, pady=10, anchor="n")
- checkbutton_square.pack(side="top", padx=10, pady=5, anchor="nw")
- button_refresh.pack(side="top", padx=10, pady=5, anchor="nw")
- button_save.pack(side="top", padx=10, pady=2, anchor="nw")
- self.root.mainloop()
- class RS232Receiver(threading.Thread):
- marker = [0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF]
- waitMarker = True
- working = False
- receivedData = []
- RS232_port = None
- received_data = None
- message_len = None
- plotData = []
- def __init__(self, plot):
- threading.Thread.__init__(self)
- self.plot_fun = plot
- def start_receive(self, port_name, baud_rate):
- self.receivedData.clear()
- self.RS232_port = serial.Serial(port_name, baud_rate, timeout=0)
- self.working = True
- def stop_receive(self):
- self.working = False
- def byte_receiver(self):
- if self.waitMarker:
- if len(self.receivedData) >= 12:
- if self.receivedData[0:len(self.marker)] == self.marker:
- del self.receivedData[0:len(self.marker)]
- self.message_len = self.receivedData[0] * 0x1000000
- self.message_len += self.receivedData[1] * 0x10000
- self.message_len += self.receivedData[2] * 0x100
- self.message_len += self.receivedData[3]
- self.message_len -= 12
- del self.receivedData[0:4]
- self.waitMarker = False
- return False
- else:
- del self.receivedData[0]
- return len(self.receivedData) <= 12
- else:
- return True
- else:
- if len(self.receivedData) >= self.message_len:
- self.plot_fun(self.receivedData[0:self.message_len].copy())
- del self.receivedData[0:self.message_len]
- self.waitMarker = True
- return True
- def run(self):
- while True:
- time.sleep(0.01)
- if self.working:
- self.receivedData.extend(list(self.RS232_port.readline()))
- while True:
- if self.byte_receiver():
- break
- else:
- if self.RS232_port is not None:
- self.RS232_port.close()
- if __name__ == '__main__':
- gui = TkGUI()
- gui.start()
- receiver = RS232Receiver(gui.plot)
- gui.receiver = receiver
- receiver.start()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement