Advertisement
Guest User

Untitled

a guest
Aug 31st, 2016
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.82 KB | None | 0 0
  1. import threading
  2. import time
  3. import tkinter
  4. from tkinter import ttk
  5.  
  6. import serial
  7. import serial.tools.list_ports
  8. from serial.tools.list_ports_windows import iterate_comports
  9.  
  10. import matplotlib.pyplot as plt
  11. from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
  12.  
  13.  
  14. class TkGUI(threading.Thread):
  15.     working = False
  16.     receiver = None
  17.     ports = []
  18.     ports_description = []
  19.  
  20.     def __init__(self):
  21.         threading.Thread.__init__(self)
  22.  
  23.     def get_ports(self):
  24.         self.ports = [p.device for p in list(iterate_comports())]
  25.         self.com_combobox['values'] = [p.device + " - " + p.description for p in list(iterate_comports())]
  26.  
  27.     def save(self):
  28.         f = tkinter.filedialog.asksaveasfile(mode='w', defaultextension=".png")
  29.         # Вставить проверку f
  30.         #self.plot()
  31.         #self.fig.savefig(f)
  32.  
  33.     def close(self):
  34.         self.root.quit()
  35.  
  36.     def start_stop(self):
  37.         if self.working:
  38.             self.receiver.stop_receive()
  39.             self.button_start_stop.configure(text=u"Пуск")
  40.             self.working = False
  41.         else:
  42.             self.receiver.start_receive("COM1", 115200)
  43.             self.rec_count_label.set(0)
  44.             self.button_start_stop.configure(text=u"Стоп")
  45.             self.working = True
  46.  
  47.     def plot(self, data):
  48.         print("plot data len: ", len(data))
  49.  
  50.     def run(self):
  51.         self.root = tkinter.Tk()
  52.         self.root.protocol("WM_DELETE_WINDOW", self.close)
  53.  
  54.         frame_left = ttk.Frame(self.root)
  55.         frame_right = ttk.Frame(self.root)
  56.  
  57.         # Левая часть
  58.         frame_Count = ttk.Frame(frame_left)
  59.         frame_Count_l1 = ttk.Label(frame_Count, text=u"Принято: ")
  60.         self.rec_count_label = tkinter.StringVar()
  61.         self.rec_count_label.set(0)
  62.         frame_Count_l2 = ttk.Label(frame_Count, textvariable=self.rec_count_label)
  63.         frame_Count_l1.pack(side="left")
  64.         frame_Count_l2.pack(side="left")
  65.         self.button_start_stop = ttk.Button(frame_left, text=u"Пуск", command=self.start_stop)
  66.         self.com_combobox = ttk.Combobox(frame_left, width=30)
  67.         self.get_ports()
  68.         frame_Count.pack(side="top", anchor="nw", padx=2, pady=2)
  69.         self.com_combobox.pack(side="top", anchor="nw", padx=2, pady=2)
  70.         self.button_start_stop.pack(side="top", anchor="nw", padx=2, pady=2)
  71.  
  72.         # График
  73.         self.fig = plt.Figure(figsize=(10, 8))
  74.         self.canvas = FigureCanvasTkAgg(self.fig, master=self.root)
  75.         self.canvas.show()
  76.         self.canvas_plot = self.canvas.get_tk_widget()
  77.  
  78.         # Правая часть
  79.         frame_right_l1 = ttk.Label(frame_right, text=u"--==~~~~~==--")
  80.  
  81.         self.minT = tkinter.StringVar()
  82.         self.minT.set("0")
  83.         frame_minT = ttk.Frame(frame_right)
  84.         ttk.Label(frame_minT, text="min T  ").pack(side="left")
  85.         ttk.Entry(frame_minT, textvariable=self.minT).pack(side="left")
  86.  
  87.         self.maxT = tkinter.StringVar()
  88.         self.maxT.set("100")
  89.         frame_maxT = ttk.Frame(frame_right)
  90.         ttk.Label(frame_maxT, text="max T  ").pack(side="left")
  91.         ttk.Entry(frame_maxT, textvariable=self.maxT).pack(side="left")
  92.  
  93.         self.stepT = tkinter.StringVar()
  94.         self.stepT.set("10")
  95.         frame_stepT = ttk.Frame(frame_right)
  96.         ttk.Label(frame_stepT, text="step T  ").pack(side="left")
  97.         ttk.Entry(frame_stepT, textvariable=self.stepT).pack(side="left")
  98.  
  99.         self.minY = tkinter.StringVar()
  100.         self.minY.set("-8000")
  101.         frame_minY = ttk.Frame(frame_right)
  102.         ttk.Label(frame_minY, text="min Y  ").pack(side="left")
  103.         ttk.Entry(frame_minY, textvariable=self.minY).pack(side="left")
  104.  
  105.         self.maxY = tkinter.StringVar()
  106.         self.maxY.set("8000")
  107.         frame_maxY = ttk.Frame(frame_right)
  108.         ttk.Label(frame_maxY, text="max Y  ").pack(side="left")
  109.         ttk.Entry(frame_maxY, textvariable=self.maxY).pack(side="left")
  110.  
  111.         self.stepY = tkinter.StringVar()
  112.         self.stepY.set("1000")
  113.         frame_stepY = ttk.Frame(frame_right)
  114.         ttk.Label(frame_stepY, text="step Y  ").pack(side="left")
  115.         ttk.Entry(frame_stepY, textvariable=self.stepY).pack(side="left")
  116.  
  117.         frame_right_l1.pack(side="top", anchor="nw", padx=2, pady=2)
  118.         frame_minT.pack(side="top", anchor="nw", padx=2, pady=2)
  119.         frame_maxT.pack(side="top", anchor="nw", padx=2, pady=2)
  120.         frame_stepT.pack(side="top", anchor="nw", padx=2, pady=2)
  121.         frame_minY.pack(side="top", anchor="nw", padx=2, pady=2)
  122.         frame_maxY.pack(side="top", anchor="nw", padx=2, pady=2)
  123.         frame_stepY.pack(side="top", anchor="nw", padx=2, pady=2)
  124.  
  125.         self.button_square = tkinter.BooleanVar()
  126.         self.button_square.set("false")
  127.         checkbutton_square = ttk.Checkbutton(frame_right, text=u"сумма квадратов", variable=self.button_square)
  128.  
  129.         button_refresh = ttk.Button(frame_right, text=u"Перерисовать", command=self.plot)
  130.         button_save = ttk.Button(frame_right, text=u"Сохранить изображение", command=self.save)
  131.  
  132.         frame_left.pack(side="left", padx=10, pady=10, anchor="n")
  133.         self.canvas_plot.pack(side="left", anchor="n", expand="true")
  134.         frame_right.pack(side="left", padx=10, pady=10, anchor="n")
  135.         checkbutton_square.pack(side="top", padx=10, pady=5, anchor="nw")
  136.         button_refresh.pack(side="top", padx=10, pady=5, anchor="nw")
  137.         button_save.pack(side="top", padx=10, pady=2, anchor="nw")
  138.  
  139.         self.root.mainloop()
  140.  
  141.  
  142. class RS232Receiver(threading.Thread):
  143.     marker = [0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF]
  144.     waitMarker = True
  145.     working = False
  146.     receivedData = []
  147.     RS232_port = None
  148.     received_data = None
  149.     message_len = None
  150.     plotData = []
  151.  
  152.     def __init__(self, plot):
  153.         threading.Thread.__init__(self)
  154.         self.plot_fun = plot
  155.  
  156.     def start_receive(self, port_name, baud_rate):
  157.         self.receivedData.clear()
  158.         self.RS232_port = serial.Serial(port_name, baud_rate, timeout=0)
  159.         self.working = True
  160.  
  161.     def stop_receive(self):
  162.         self.working = False
  163.  
  164.     def byte_receiver(self):
  165.         if self.waitMarker:
  166.             if len(self.receivedData) >= 12:
  167.                 if self.receivedData[0:len(self.marker)] == self.marker:
  168.                     del self.receivedData[0:len(self.marker)]
  169.                     self.message_len = self.receivedData[0] * 0x1000000
  170.                     self.message_len += self.receivedData[1] * 0x10000
  171.                     self.message_len += self.receivedData[2] * 0x100
  172.                     self.message_len += self.receivedData[3]
  173.                     self.message_len -= 12
  174.                     del self.receivedData[0:4]
  175.                     self.waitMarker = False
  176.                     return False
  177.                 else:
  178.                     del self.receivedData[0]
  179.                     return len(self.receivedData) <= 12
  180.             else:
  181.                 return True
  182.         else:
  183.             if len(self.receivedData) >= self.message_len:
  184.                 self.plot_fun(self.receivedData[0:self.message_len].copy())
  185.                 del self.receivedData[0:self.message_len]
  186.                 self.waitMarker = True
  187.             return True
  188.  
  189.     def run(self):
  190.         while True:
  191.             time.sleep(0.01)
  192.             if self.working:
  193.                 self.receivedData.extend(list(self.RS232_port.readline()))
  194.                 while True:
  195.                     if self.byte_receiver():
  196.                         break
  197.             else:
  198.                 if self.RS232_port is not None:
  199.                     self.RS232_port.close()
  200.  
  201.  
  202. if __name__ == '__main__':
  203.     gui = TkGUI()
  204.     gui.start()
  205.     receiver = RS232Receiver(gui.plot)
  206.     gui.receiver = receiver
  207.     receiver.start()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement