应变片信号采集--串口程序--借助python和tkinter
生活随笔
收集整理的這篇文章主要介紹了
应变片信号采集--串口程序--借助python和tkinter
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?應變片信號采集--串口程序
- 解決方案
利用python中的serial串口通信工具包實現與下位機通信,利用tkinter工具包編寫GUI界面用于實時顯示采集到的信號和傳輸指令。
界面設計:
?最終效果:
?
?參考代碼:
#應變信號采集(為保證測量精確度,可將砝碼及物體的質量擴大100000倍,代入計算) #! /usr/bin/env python # -*- coding: utf-8 -*-import threading import tkinter as tk import serial.tools.list_ports from tkinter import ttk from tkinter import scrolledtext#創建存檔文件 file=open('data.csv', 'w+') #定義父容器 SerialPort = serial.Serial() GUI = tk.Tk() # 父容器 GUI.title("Serial Tool") # 父容器標題 GUI.geometry("440x600") # 父容器大小#顯示操作信息的框圖 Information = tk.LabelFrame(GUI, text="操作信息", padx=10, pady=10) # 創建一個框架 Information.place(x=20, y=20) #將該框架放在x=20,y=20的地方 Information_Window = scrolledtext.ScrolledText(Information, width=20, height=5, padx=10, pady=10, wrap=tk.WORD) #創建一個有滾動條的文本框 Information_Window.grid()#創建發送指令框架 Send = tk.LabelFrame(GUI, text="發送指令", padx=10, pady=5) # 水平,垂直方向上的邊距均為 10 Send.place(x=240, y=20) # 定義保存文本框內容的字符串 DataSend = tk.StringVar() #輸出窗的內容 EntrySend = tk.StringVar() #輸入窗的內容 #創建輸入窗口 Send_Window = ttk.Entry(Send, textvariable=EntrySend, width=23) #窗口的指令為 textvariable, Send_Window.grid()#將輸入的指令輸出到輸出窗口,并執行指令 def WriteData():global DataSendDataSend = EntrySend.get()Information_Window.insert("end", '發送指令為:' + str(DataSend) + '\n') # 在操作信息窗口顯示發送的指令并換行,end為在窗口末尾處顯示Information_Window.see("end") # 此處為顯示操作信息窗口進度條末尾內容,以上兩行可實現窗口內容滿時,進度條自動下滾并在最下方顯示新的內容SerialPort.write(bytes(DataSend, encoding='utf8'))#將指定的字符串寫入串行端口。發送命令,編碼成utf8格式#設置一個激活以上操作的按鈕 tk.Button(Send, text="發送", command=WriteData).grid(pady=5, sticky=tk.E) #放在最東面#接收文本框(帶滾動條) Receive = tk.LabelFrame(GUI, text="接收區", padx=10, pady=10) # 水平,垂直方向上的邊距均為 10 Receive.place(x=240, y=124) Receive_Window = scrolledtext.ScrolledText(Receive, width=18, height=9, padx=8, pady=10, wrap=tk.WORD) Receive_Window.grid()#建立系數 #設定初始值 k=1.0 b=0.0 text1=tk.Label(GUI, text="k:",padx=10, pady=10) #Label組件用于顯示文本和圖像 text1.place(x=220, y=350) text2=tk.Label(GUI, text="b:",padx=10, pady=10) text2.place(x=220, y=380) v1 = tk.StringVar() v2 = tk.StringVar() e1 = tk.Entry(GUI,textvariable=v1) e2 = tk.Entry(GUI,textvariable=v2) e1.place(x=290, y=360) e2.place(x=290, y=390) def insert_1():global k,bk = v1.get()k=float(k)b = v2.get()b = float(b) b2=tk.Button(GUI,text='輸入參數',width=8,height=1,command=insert_1) b2.place(x=290, y=420)#建立物品質量框圖 result = tk.LabelFrame(GUI, text='物品質量 /g', padx=10, pady=10) # 水平,垂直方向上的邊距均為 10 result.place(x=20, y=350) result_Window = scrolledtext.ScrolledText(result, width=18, height=9, padx=8, pady=10, wrap=tk.WORD) result_Window.grid()#傳輸數據選項框圖 option = tk.LabelFrame(GUI, text="選項", padx=10, pady=10) # 水平,垂直方向上的邊距均為10 option.place(x=20, y=150, width=203) # 坐標位置 # 創建下拉列表 ttk.Label(option, text="串口號:").grid(column=0, row=0) # 添加串口號標簽,第0行第0列 ttk.Label(option, text="波特率:").grid(column=0, row=1) # 添加波特率標簽 #建立端口號列表 Port = tk.StringVar() # 端口號字符串 Port_list = ttk.Combobox(option, width=12, textvariable=Port, state='readonly')#創建下拉菜單欄 ListPorts = list(serial.tools.list_ports.comports())#掃描當前可用串口保存到表ListPorts Port_list['values'] = [i[0] for i in ListPorts]## 下拉列表的值為ListPorts的所有值 Port_list.current()# 初始顯示表中第一個值 Port_list.grid(column=1, row=0) # 設置其在界面中出現的位置 #建立波特率列表 BaudRate = tk.StringVar() # 波特率字符串 BaudRate_list = ttk.Combobox(option, width=12, textvariable=BaudRate, state='readonly') BaudRate_list['values'] = (1200, 2400, 4800, 9600, 14400, 19200, 38400, 43000, 57600, 76800, 115200) BaudRate_list.current(5)# 初始顯示19200 BaudRate_list.grid(column=1, row=1) # 設置其在界面中出現的位置 column代表列 row 代表行#開關框圖 switch = tk.LabelFrame(GUI, text="開關", padx=10, pady=10) # 水平,垂直方向上的邊距均為 10 switch.place(x=20, y=250, width=203) # 定位坐標#不斷讀取串口數據,并計算 def ReceiveData():while SerialPort.isOpen():Receive_Window.insert("end", str(SerialPort.readline()) + '\n') #在接收窗口不斷顯示接受的數據,一行一行地讀數據Receive_Window.see("end")#number = int.from_bytes(str(SerialPort.readline()), byteorder='big') #全部讀取的方式,一般不用# 轉換字符串為16進制,再轉換為10進制。data = SerialPort.readline()#讀取的數據類型為字節類型str1 = data.hex() # 轉換為16進制,解碼num0 = str1[6:] # 截取需要的數據部分num1 = int(num0, 16) # 轉換為10進制print(num1)file = open('data.csv', 'a')file.write(str(num1) + '\n')file.close()num1=float(num1)result_Window.insert("end", str(b+k*num1) + '\n')#將字節串轉換為數字并求出方程result_Window.see("end") #關閉數據的讀取 def Close_Serial():SerialPort.close() #打開數據讀取 def Open_Serial():if not SerialPort.isOpen():SerialPort.port = Port_list.get()# 讀取端口下拉菜單欄的選擇,將其設為串口的端口SerialPort.baudrate = BaudRate_list.get()# 讀取波特率下拉菜單欄的選擇,將其設為串口的波特率SerialPort.timeout = 0.1SerialPort.open() # 打開串口if SerialPort.isOpen():t = threading.Thread(target=ReceiveData) # 新建線程用來不斷接收數據并顯示,與主線程并行t.setDaemon(True)# 守護線程t.start()# 開始線程else:SerialPort.close() #設置開始和結束按鈕,并執行指令 tk.Button(switch, text="開始采集", command=Open_Serial).pack(side="left", padx=13) tk.Button(switch, text="停止采集", command=Close_Serial).pack(side="right", padx=13)GUI.mainloop()#程序還是有點小問題,敬請改正#
總結
以上是生活随笔為你收集整理的应变片信号采集--串口程序--借助python和tkinter的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IDEA java编译中出现了Excep
- 下一篇: php大学生创意礼品电商平台的设计与实现