最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python使用Tkinter編寫串口通信調(diào)試工具

 更新時間:2026年01月29日 08:57:20   作者:xingzhemengyou1  
串口調(diào)試助手是一款基于Python和Tkinter開發(fā)的串口通信調(diào)試工具, 專為工程師和開發(fā)者設(shè)計,下面為大家詳細介紹了如何使用Python實現(xiàn)串口通信調(diào)試工具,希望對大家有所幫助

簡介

串口調(diào)試助手是一款基于Python和Tkinter開發(fā)的串口通信調(diào)試工具, 專為工程師和開發(fā)者設(shè)計。它提供了簡潔清爽的用戶界面, 支持完整的串口配置、數(shù)據(jù)收發(fā)、自動發(fā)送、日志記錄等功能, 是進行串口通信測試和調(diào)試的理想工具。

效果圖如下:

核心功能

串口配置:支持完整的串口參數(shù)配置,包括串口號、波特率、數(shù)據(jù)位、停止位、校驗位等,滿足各種串口通信需求。

數(shù)據(jù)接收:實時接收串口數(shù)據(jù),支持文本和十六進制兩種顯示模式,自動統(tǒng)計接收字節(jié)數(shù)。

數(shù)據(jù)發(fā)送:支持手動發(fā)送和自動發(fā)送兩種模式,可發(fā)送文本或十六進制數(shù)據(jù),自動統(tǒng)計發(fā)送字節(jié)數(shù)。

自動發(fā)送:可設(shè)置自動發(fā)送間隔,支持自定義發(fā)送內(nèi)容,適合進行周期性數(shù)據(jù)測試。

日志保存:支持將接收到的數(shù)據(jù)保存為日志文件,方便后續(xù)分析和調(diào)試。

配置管理:自動保存和加載配置參數(shù),下次啟動時自動恢復(fù)上次的設(shè)置。

功能詳解

  • 串口參數(shù)配置支持波特率:300/600/1200/2400/4800/9600/14400/19200/38400/57600/115200
  • 數(shù)據(jù)位設(shè)置支持5/6/7/8位數(shù)據(jù)位
  • 停止位設(shè)置支持1/1.5/2位停止位
  • 校驗位設(shè)置支持None/Even/Odd/Mark/Space五種校驗方式
  • 十六進制顯示接收區(qū)域支持十六進制和文本兩種顯示模式切換
  • 十六進制發(fā)送發(fā)送區(qū)域支持十六進制和文本兩種發(fā)送模式切換
  • 數(shù)據(jù)統(tǒng)計實時顯示RX(接收)和TX(發(fā)送)的字節(jié)數(shù)統(tǒng)計
  • 清空功能支持清空接收區(qū)域和發(fā)送區(qū)域的內(nèi)容
  • 狀態(tài)提示底部狀態(tài)欄實時顯示當前操作狀態(tài)

使用說明

  • 選擇串口在工具欄中選擇要使用的串口號,點擊"刷新"按鈕可更新串口列表
  • 配置參數(shù)設(shè)置波特率、數(shù)據(jù)位、停止位、校驗位等串口參數(shù),確保與目標設(shè)備一致
  • 打開串口點擊"打開串口"按鈕,程序?qū)L試連接并打開指定的串口
  • 發(fā)送數(shù)據(jù)在發(fā)送區(qū)域輸入要發(fā)送的數(shù)據(jù),點擊"發(fā)送"按鈕即可發(fā)送,也可勾選"十六進制發(fā)送"發(fā)送十六進制數(shù)據(jù)
  • 接收數(shù)據(jù)接收區(qū)域會自動顯示接收到的數(shù)據(jù),可勾選"十六進制顯示"以十六進制格式查看
  • 自動發(fā)送在自動發(fā)送區(qū)域勾選"啟用自動發(fā)送",設(shè)置發(fā)送間隔,程序?qū)⒆詣又芷谛园l(fā)送數(shù)據(jù)
  • 保存日志點擊"保存日志"按鈕,可將接收區(qū)域的內(nèi)容保存為文本文件
  • 關(guān)閉串口使用完畢后,點擊"關(guān)閉串口"按鈕斷開連接

技術(shù)特點

Python開發(fā):基于Python 3.x開發(fā),跨平臺兼容

Tkinter界面:使用Tkinter構(gòu)建簡潔清爽的GUI界面

PySerial庫:使用PySerial庫實現(xiàn)串口通信

多線程處理:使用多線程實現(xiàn)異步數(shù)據(jù)接收

配置持久化:使用JSON格式保存和加載配置

簡約設(shè)計:界面簡潔清爽,操作直觀便捷

運行要求

系統(tǒng)要求

Windows / Linux / macOS

# 安裝依賴庫
pip install pyserial
# 運行程序
python serial_assistant.py

界面說明

工具欄:位于窗口頂部,包含串口配置、打開/關(guān)閉按鈕等控制組件,高度60px,簡約風格設(shè)計。

接收區(qū)域:位于左側(cè),顯示接收到的數(shù)據(jù),支持十六進制顯示,包含清空和保存日志按鈕。

發(fā)送區(qū)域:位于右側(cè),用于輸入和發(fā)送數(shù)據(jù),支持十六進制發(fā)送,包含發(fā)送和清空按鈕。

狀態(tài)欄:位于窗口底部,顯示當前狀態(tài)、RX/TX計數(shù)等信息。

python 代碼

"""
串口調(diào)試助手 - 簡化版
功能:串口配置、數(shù)據(jù)收發(fā)、自動發(fā)送、日志記錄等
UI:簡潔清爽,易于使用
"""

import tkinter as tk
from tkinter import ttk, scrolledtext, messagebox, filedialog
import serial
import serial.tools.list_ports
import threading
import time
from datetime import datetime
import json
import os


class SerialAssistant:
    """串口調(diào)試助手主類"""
    
    def __init__(self, root):
        self.root = root
        self.root.title("串口調(diào)試助手")
        self.root.geometry("900x650")
        self.root.resizable(True, True)
        
        # 串口對象
        self.serial_port = None
        self.is_open = False
        self.receive_thread = None
        self.is_running = False
        self.auto_send_timer = None
        
        # 簡化配色方案
        self.COLORS = {
            'primary': '#2196F3',
            'success': '#4CAF50',
            'danger': '#F44336',
            'warning': '#FF9800',
            'bg': '#FFFFFF',
            'text': '#000000',
            'border': '#CCCCCC',
            'bg_light': '#F5F5F5'
        }
        
        # 配置參數(shù)
        self.config = {
            'port': '',
            'baudrate': '9600',
            'bytesize': '8',
            'parity': 'None',
            'stopbits': '1',
            'send_hex': False,
            'receive_hex': False,
            'auto_send': False,
            'auto_send_interval': 1000,
            'auto_send_data': ''
        }
        
        # 加載配置
        self.load_config()
        
        # 創(chuàng)建界面
        self.create_widgets()
        
        # 刷新串口列表
        self.refresh_ports()
        
        # 窗口關(guān)閉事件
        self.root.protocol("WM_DELETE_WINDOW", self.on_close)
    
    def create_widgets(self):
        """創(chuàng)建界面組件"""
        # 主容器
        main_container = tk.Frame(self.root, bg=self.COLORS['bg'])
        main_container.pack(fill="both", expand=True)
        
        # 頂部工具欄
        self.create_toolbar(main_container)
        
        # 中間內(nèi)容區(qū)域
        content_area = tk.Frame(main_container, bg=self.COLORS['bg'])
        content_area.pack(fill="both", expand=True, padx=10, pady=10)
        
        # 左側(cè)接收區(qū)域
        self.create_receive_area(content_area)
        
        # 右側(cè)發(fā)送區(qū)域
        self.create_send_area(content_area)
        
        # 底部狀態(tài)欄
        self.create_status_bar(main_container)
    
    def create_toolbar(self, parent):
        """創(chuàng)建頂部工具欄 - 簡約風格"""
        toolbar = tk.Frame(parent, bg=self.COLORS['bg_light'], height=60)
        toolbar.pack(fill="x", side="top", padx=5, pady=5)
        toolbar.pack_propagate(False)
        
        # 第一行:標題和串口配置
        # 標題
        title_label = tk.Label(
            toolbar,
            text="串口調(diào)試助手",
            font=("Arial", 11, "bold"),
            fg=self.COLORS['primary'],
            bg=self.COLORS['bg_light']
        )
        title_label.grid(row=0, column=0, columnspan=2, pady=2, sticky="w")
        
        # 串口選擇
        tk.Label(toolbar, text="串口:", bg=self.COLORS['bg_light']).grid(row=1, column=0, padx=2, pady=2)
        self.port_combo = ttk.Combobox(toolbar, width=10, state="readonly")
        self.port_combo.grid(row=1, column=1, padx=2, pady=2)
        
        # 波特率
        tk.Label(toolbar, text="波特率:", bg=self.COLORS['bg_light']).grid(row=1, column=2, padx=3)
        self.baudrate_combo = ttk.Combobox(
            toolbar,
            width=8,
            values=['300', '600', '1200', '2400', '4800', '9600', '14400', '19200', '38400', '57600', '115200'],
            state="readonly"
        )
        self.baudrate_combo.grid(row=1, column=3, padx=3)
        self.baudrate_combo.set(self.config['baudrate'])
        
        # 數(shù)據(jù)位
        tk.Label(toolbar, text="數(shù)據(jù)位:", bg=self.COLORS['bg_light']).grid(row=1, column=4, padx=3)
        self.bytesize_combo = ttk.Combobox(
            toolbar,
            width=4,
            values=['5', '6', '7', '8'],
            state="readonly"
        )
        self.bytesize_combo.grid(row=1, column=5, padx=3)
        self.bytesize_combo.set(self.config['bytesize'])
        
        # 停止位
        tk.Label(toolbar, text="停止位:", bg=self.COLORS['bg_light']).grid(row=1, column=6, padx=3)
        self.stopbits_combo = ttk.Combobox(
            toolbar,
            width=4,
            values=['1', '1.5', '2'],
            state="readonly"
        )
        self.stopbits_combo.grid(row=1, column=7, padx=3)
        self.stopbits_combo.set(self.config['stopbits'])
        
        # 校驗位
        tk.Label(toolbar, text="校驗位:", bg=self.COLORS['bg_light']).grid(row=2, column=0, padx=3)
        self.parity_combo = ttk.Combobox(
            toolbar,
            width=8,
            values=['None', 'Even', 'Odd', 'Mark', 'Space'],
            state="readonly"
        )
        self.parity_combo.grid(row=2, column=1, padx=3)
        self.parity_combo.set(self.config['parity'])
        
        # 刷新按鈕
        refresh_btn = tk.Button(
            toolbar,
            text="刷新",
            command=self.refresh_ports,
            width=8
        )
        refresh_btn.grid(row=2, column=2, padx=5, pady=5)
        
        # 打開/關(guān)閉按鈕
        self.open_btn = tk.Button(
            toolbar,
            text="打開串口",
            command=self.toggle_port,
            bg=self.COLORS['success'],
            fg='white',
            width=12
        )
        self.open_btn.grid(row=2, column=3, columnspan=2, padx=5, pady=5)
    
    def create_receive_area(self, parent):
        """創(chuàng)建接收區(qū)域 - 簡約風格"""
        receive_frame = tk.Frame(parent, bg=self.COLORS['bg'])
        receive_frame.pack(side="left", fill="both", expand=True, padx=3)
        
        # 標題
        tk.Label(
            receive_frame,
            text="接收區(qū)域",
            font=("Arial", 10, "bold"),
            bg=self.COLORS['bg']
        ).pack(pady=5)
        
        # 接收選項
        options_frame = tk.Frame(receive_frame, bg=self.COLORS['bg'])
        options_frame.pack(fill="x", padx=5, pady=5)
        
        self.receive_hex_var = tk.BooleanVar(value=self.config['receive_hex'])
        tk.Checkbutton(
            options_frame,
            text="十六進制顯示",
            variable=self.receive_hex_var,
            bg=self.COLORS['bg'],
            command=self.update_receive_hex
        ).pack(side="left")
        
        # 接收文本框
        self.receive_text = scrolledtext.ScrolledText(
            receive_frame,
            height=20,
            width=50,
            font=("Consolas", 10),
            state='disabled'
        )
        self.receive_text.pack(fill="both", expand=True, padx=5, pady=5)
        
        # 按鈕區(qū)域
        btn_frame = tk.Frame(receive_frame, bg=self.COLORS['bg'])
        btn_frame.pack(fill="x", padx=5, pady=5)
        
        tk.Button(
            btn_frame,
            text="清空接收",
            command=self.clear_receive,
            width=10
        ).pack(side="left", padx=5)
        
        tk.Button(
            btn_frame,
            text="保存日志",
            command=self.save_log,
            width=10
        ).pack(side="left", padx=5)
    
    def create_send_area(self, parent):
        """創(chuàng)建發(fā)送區(qū)域 - 簡約風格"""
        send_frame = tk.Frame(parent, bg=self.COLORS['bg'])
        send_frame.pack(side="right", fill="both", expand=True, padx=3)
        
        # 標題
        tk.Label(
            send_frame,
            text="發(fā)送區(qū)域",
            font=("Arial", 10, "bold"),
            bg=self.COLORS['bg']
        ).pack(pady=5)
        
        # 發(fā)送選項
        options_frame = tk.Frame(send_frame, bg=self.COLORS['bg'])
        options_frame.pack(fill="x", padx=5, pady=5)
        
        self.send_hex_var = tk.BooleanVar(value=self.config['send_hex'])
        tk.Checkbutton(
            options_frame,
            text="十六進制發(fā)送",
            variable=self.send_hex_var,
            bg=self.COLORS['bg'],
            command=self.update_send_hex
        ).pack(side="left")
        
        # 發(fā)送文本框 - 使用ScrolledText與接收區(qū)域保持一致
        self.send_text = scrolledtext.ScrolledText(
            send_frame,
            height=20,
            width=50,
            font=("Consolas", 10)
        )
        self.send_text.pack(fill="both", expand=True, padx=5, pady=5)
        self.send_text.insert("1.0", self.config['auto_send_data'])
        
        # 按鈕區(qū)域 - 與接收區(qū)域保持一致的布局
        btn_frame = tk.Frame(send_frame, bg=self.COLORS['bg'])
        btn_frame.pack(fill="x", padx=5, pady=5)
        
        tk.Button(
            btn_frame,
            text="發(fā)送",
            command=self.send_data,
            bg=self.COLORS['primary'],
            fg='white',
            width=10
        ).pack(side="left", padx=5)
        
        tk.Button(
            btn_frame,
            text="清空發(fā)送",
            command=self.clear_send,
            width=10
        ).pack(side="left", padx=5)
        
        # 自動發(fā)送區(qū)域
        auto_frame = tk.LabelFrame(send_frame, text="自動發(fā)送", bg=self.COLORS['bg'])
        auto_frame.pack(fill="x", padx=5, pady=10)
        
        self.auto_send_var = tk.BooleanVar(value=self.config['auto_send'])
        tk.Checkbutton(
            auto_frame,
            text="啟用自動發(fā)送",
            variable=self.auto_send_var,
            bg=self.COLORS['bg'],
            command=self.toggle_auto_send
        ).pack(pady=5)
        
        interval_frame = tk.Frame(auto_frame, bg=self.COLORS['bg'])
        interval_frame.pack(pady=5)
        
        tk.Label(interval_frame, text="間隔(ms):", bg=self.COLORS['bg']).pack(side="left")
        self.interval_entry = tk.Entry(interval_frame, width=10)
        self.interval_entry.pack(side="left", padx=5)
        self.interval_entry.insert(0, str(self.config['auto_send_interval']))
    
    def create_status_bar(self, parent):
        """創(chuàng)建狀態(tài)欄"""
        status_bar = tk.Frame(parent, bg=self.COLORS['bg_light'], height=30)
        status_bar.pack(fill="x", side="bottom")
        status_bar.pack_propagate(False)
        
        self.status_label = tk.Label(
            status_bar,
            text="就緒",
            bg=self.COLORS['bg_light'],
            anchor="w"
        )
        self.status_label.pack(side="left", padx=10, pady=5)
        
        # 分隔線
        tk.Frame(status_bar, width=2, bg=self.COLORS['border']).pack(side="left", padx=10, fill="y")
        
        self.rx_count_label = tk.Label(
            status_bar,
            text="RX: 0",
            bg=self.COLORS['bg_light']
        )
        self.rx_count_label.pack(side="left", padx=10)
        
        self.tx_count_label = tk.Label(
            status_bar,
            text="TX: 0",
            bg=self.COLORS['bg_light']
        )
        self.tx_count_label.pack(side="left", padx=10)
    
    def refresh_ports(self):
        """刷新串口列表"""
        ports = serial.tools.list_ports.comports()
        port_list = [port.device for port in ports]
        self.port_combo['values'] = port_list
        if port_list and not self.port_combo.get():
            self.port_combo.current(0)
        self.update_status(f"發(fā)現(xiàn) {len(port_list)} 個串口")
    
    def toggle_port(self):
        """打開/關(guān)閉串口"""
        if self.is_open:
            self.close_port()
        else:
            self.open_port()
    
    def open_port(self):
        """打開串口"""
        port = self.port_combo.get()
        if not port:
            messagebox.showwarning("警告", "請選擇串口")
            return
        
        try:
            self.serial_port = serial.Serial(
                port=port,
                baudrate=int(self.baudrate_combo.get()),
                bytesize=int(self.bytesize_combo.get()),
                parity=self.parity_combo.get()[0] if self.parity_combo.get() != 'None' else 'N',
                stopbits=float(self.stopbits_combo.get()),
                timeout=1
            )
            self.is_open = True
            self.is_running = True
            self.open_btn.config(text="關(guān)閉串口", bg=self.COLORS['danger'])
            self.update_status(f"串口 {port} 已打開")
            
            # 啟動接收線程
            self.receive_thread = threading.Thread(target=self.receive_data, daemon=True)
            self.receive_thread.start()
            
            # 保存配置
            self.save_config()
            
        except Exception as e:
            messagebox.showerror("錯誤", f"打開串口失敗: {str(e)}")
            self.update_status(f"打開串口失敗: {str(e)}")
    
    def close_port(self):
        """關(guān)閉串口"""
        if self.auto_send_var.get():
            self.toggle_auto_send()
        
        self.is_running = False
        if self.serial_port and self.serial_port.is_open:
            self.serial_port.close()
        
        self.is_open = False
        self.open_btn.config(text="打開串口", bg=self.COLORS['success'])
        self.update_status("串口已關(guān)閉")
    
    def receive_data(self):
        """接收數(shù)據(jù)線程"""
        rx_count = 0
        
        while self.is_running:
            try:
                if self.serial_port and self.serial_port.is_open:
                    data = self.serial_port.read_all()
                    if data:
                        rx_count += len(data)
                        self.root.after(0, self.update_receive_text, data)
                        self.root.after(0, self.update_rx_count, rx_count)
                time.sleep(0.01)
            except Exception as e:
                self.root.after(0, self.update_status, f"接收錯誤: {str(e)}")
                break
    
    def update_receive_text(self, data):
        """更新接收文本"""
        self.receive_text.config(state='normal')
        
        if self.receive_hex_var.get():
            hex_str = ' '.join([f'{byte:02X}' for byte in data])
            self.receive_text.insert("end", hex_str + '\n')
        else:
            try:
                text = data.decode('utf-8', errors='ignore')
                self.receive_text.insert("end", text)
            except:
                hex_str = ' '.join([f'{byte:02X}' for byte in data])
                self.receive_text.insert("end", hex_str + '\n')
        
        self.receive_text.see("end")
        self.receive_text.config(state='disabled')
    
    def send_data(self):
        """發(fā)送數(shù)據(jù)"""
        if not self.is_open:
            messagebox.showwarning("警告", "請先打開串口")
            return
        
        data_str = self.send_text.get("1.0", "end-1c")
        if not data_str:
            messagebox.showwarning("警告", "請輸入要發(fā)送的數(shù)據(jù)")
            return
        
        try:
            if self.send_hex_var.get():
                # 十六進制發(fā)送
                hex_str = data_str.replace(' ', '').replace('\n', '')
                data = bytes.fromhex(hex_str)
            else:
                # 文本發(fā)送
                data = data_str.encode('utf-8')
            
            self.serial_port.write(data)
            self.update_status(f"已發(fā)送 {len(data)} 字節(jié)")
            
            # 更新發(fā)送計數(shù)
            if not hasattr(self, 'tx_count'):
                self.tx_count = 0
            self.tx_count += len(data)
            self.update_tx_count(self.tx_count)
            
        except Exception as e:
            messagebox.showerror("錯誤", f"發(fā)送失敗: {str(e)}")
            self.update_status(f"發(fā)送失敗: {str(e)}")
    
    def toggle_auto_send(self):
        """切換自動發(fā)送"""
        if self.auto_send_var.get():
            try:
                interval = int(self.interval_entry.get())
                if interval < 10:
                    messagebox.showwarning("警告", "發(fā)送間隔不能小于10ms")
                    self.auto_send_var.set(False)
                    return
                
                self.config['auto_send'] = True
                self.config['auto_send_interval'] = interval
                self.auto_send_timer = self.root.after(interval, self.auto_send)
                self.update_status(f"自動發(fā)送已啟動,間隔 {interval}ms")
                
            except ValueError:
                messagebox.showwarning("警告", "請輸入有效的間隔時間")
                self.auto_send_var.set(False)
        else:
            self.config['auto_send'] = False
            if self.auto_send_timer:
                self.root.after_cancel(self.auto_send_timer)
                self.auto_send_timer = None
            self.update_status("自動發(fā)送已停止")
        
        self.save_config()
    
    def auto_send(self):
        """自動發(fā)送"""
        if self.auto_send_var.get() and self.is_open:
            self.send_data()
            interval = int(self.interval_entry.get())
            self.auto_send_timer = self.root.after(interval, self.auto_send)
    
    def clear_receive(self):
        """清空接收區(qū)"""
        self.receive_text.config(state='normal')
        self.receive_text.delete("1.0", "end")
        self.receive_text.config(state='disabled')
        self.update_status("接收區(qū)已清空")
    
    def clear_send(self):
        """清空發(fā)送區(qū)"""
        self.send_text.delete("1.0", "end")
        self.update_status("發(fā)送區(qū)已清空")
    
    def save_log(self):
        """保存日志"""
        content = self.receive_text.get("1.0", "end-1c")
        if not content:
            messagebox.showinfo("提示", "沒有可保存的日志")
            return
        
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        filename = f"serial_log_{timestamp}.txt"
        
        file_path = filedialog.asksaveasfilename(
            defaultextension=".txt",
            initialfile=filename,
            filetypes=[("文本文件", "*.txt"), ("所有文件", "*.*")]
        )
        
        if file_path:
            try:
                with open(file_path, 'w', encoding='utf-8') as f:
                    f.write(content)
                messagebox.showinfo("成功", f"日志已保存到 {file_path}")
                self.update_status(f"日志已保存")
            except Exception as e:
                messagebox.showerror("錯誤", f"保存失敗: {str(e)}")
    
    def update_status(self, message):
        """更新狀態(tài)欄"""
        self.status_label.config(text=message)
    
    def update_rx_count(self, count):
        """更新接收計數(shù)"""
        self.rx_count_label.config(text=f"RX: {count}")
    
    def update_tx_count(self, count):
        """更新發(fā)送計數(shù)"""
        self.tx_count_label.config(text=f"TX: {count}")
    
    def update_receive_hex(self):
        """更新接收十六進制設(shè)置"""
        self.config['receive_hex'] = self.receive_hex_var.get()
        self.save_config()
    
    def update_send_hex(self):
        """更新發(fā)送十六進制設(shè)置"""
        self.config['send_hex'] = self.send_hex_var.get()
        self.save_config()
    
    def save_config(self):
        """保存配置"""
        self.config['port'] = self.port_combo.get()
        self.config['baudrate'] = self.baudrate_combo.get()
        self.config['bytesize'] = self.bytesize_combo.get()
        self.config['parity'] = self.parity_combo.get()
        self.config['stopbits'] = self.stopbits_combo.get()
        
        try:
            with open('serial_config.json', 'w', encoding='utf-8') as f:
                json.dump(self.config, f, indent=4, ensure_ascii=False)
        except Exception as e:
            print(f"保存配置失敗: {e}")
    
    def load_config(self):
        """加載配置"""
        try:
            if os.path.exists('serial_config.json'):
                with open('serial_config.json', 'r', encoding='utf-8') as f:
                    config = json.load(f)
                    self.config.update(config)
        except Exception as e:
            print(f"加載配置失敗: {e}")
    
    def on_close(self):
        """窗口關(guān)閉事件"""
        if self.is_open:
            self.close_port()
        self.root.destroy()


def main():
    """主函數(shù)"""
    root = tk.Tk()
    app = SerialAssistant(root)
    root.mainloop()


if __name__ == "__main__":
    main()

配置文件serial_config.json

{
    "port": "COM1",
    "baudrate": "115200",
    "bytesize": "8",
    "parity": "None",
    "stopbits": "1",
    "send_hex": false,
    "receive_hex": false,
    "auto_send": true,
    "auto_send_interval": 1000,
    "auto_send_data": ""
}

以上就是Python使用Tkinter編寫串口通信調(diào)試工具的詳細內(nèi)容,更多關(guān)于Python串口通信調(diào)試的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 深入學(xué)習(xí)Python中的裝飾器使用

    深入學(xué)習(xí)Python中的裝飾器使用

    @這個操作符讓裝飾器在Python代碼中非常醒目,而裝飾器的運用中也包含著很多Python編程中的高級技巧,這里我們就來共同深入學(xué)習(xí)Python中的裝飾器使用
    2016-06-06
  • Django框架配置mysql數(shù)據(jù)庫實現(xiàn)過程

    Django框架配置mysql數(shù)據(jù)庫實現(xiàn)過程

    這篇文章主要介紹了Django框架配置mysql數(shù)據(jù)庫實現(xiàn)過程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • python基礎(chǔ)篇之pandas常用基本函數(shù)匯總

    python基礎(chǔ)篇之pandas常用基本函數(shù)匯總

    Pandas是一個python數(shù)據(jù)分析庫,它提供了許多函數(shù)和方法來加快數(shù)據(jù)分析過程,下面這篇文章主要給大家介紹了關(guān)于python基礎(chǔ)篇之pandas常用基本函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • 簡單示例解析python爬蟲IP的使用(小白篇)

    簡單示例解析python爬蟲IP的使用(小白篇)

    這篇文章主要為大家通過簡單示例解析python爬蟲IP的使用介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • Python?Decorator的設(shè)計模式演繹過程解析

    Python?Decorator的設(shè)計模式演繹過程解析

    本文主要梳理了Python?decorator的實現(xiàn)思路,解釋了為什么Python?decorator是現(xiàn)在這個樣子,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Python使用tkinter寫一個本地密碼管理器

    Python使用tkinter寫一個本地密碼管理器

    閑來無事,看到自己有很多網(wǎng)站的賬戶密碼,有些網(wǎng)站可能打開一兩次也就忘記了,下一次在輸入賬戶密碼就想不起來,這樣很容易丟失賬號。所以本文就來用Python和tkinter寫一個本地密碼管理器吧
    2023-05-05
  • 利用Python代碼制作過年春聯(lián)

    利用Python代碼制作過年春聯(lián)

    這篇文章主要介紹了如何利用代碼編寫過年的春聯(lián),文中一共介紹了兩種方法,一是利用HTML+CSS+JS,二是利用Python,感興趣的可以試一試
    2022-01-01
  • Python實現(xiàn)模擬瀏覽器請求及會話保持操作示例

    Python實現(xiàn)模擬瀏覽器請求及會話保持操作示例

    這篇文章主要介紹了Python實現(xiàn)模擬瀏覽器請求及會話保持操作,結(jié)合實例形式分析了Python基于urllib與urllib2模塊模擬瀏覽器請求及cookie保存會話相關(guān)操作技巧,需要的朋友可以參考下
    2018-07-07
  • Python之條件判斷語句詳解(if、while、邏輯運算符)

    Python之條件判斷語句詳解(if、while、邏輯運算符)

    文章介紹了if語句、邏輯運算符and/or、while語句的使用方法,并通過示例代碼展示了if語句的基本結(jié)構(gòu)、嵌套、邏輯運算符的用法以及while語句的基本結(jié)構(gòu)、死循環(huán)、嵌套和循環(huán)練習(xí)
    2026-05-05
  • 利用Python編寫簡易的錄制屏幕小工具

    利用Python編寫簡易的錄制屏幕小工具

    這篇文章主要為大家詳細介紹了如何利用Python語言編寫一個簡易的錄制屏幕小工具,文中的示例代碼講解詳細,感興趣的小伙伴可以動手嘗試一下
    2022-08-08

最新評論

昌都县| 太仆寺旗| 秦安县| 竹北市| 青浦区| 内江市| 台北县| 都安| 顺平县| 肥东县| 山东省| 建宁县| 兴安盟| 吉木乃县| 高安市| 金山区| 林甸县| 龙州县| 上饶市| 锦屏县| 富顺县| 安新县| 北宁市| 三亚市| 缙云县| 洛隆县| 八宿县| 方山县| 康乐县| 苍溪县| 云阳县| 乌拉特前旗| 凤凰县| 商丘市| 拉萨市| 台前县| 南华县| 南康市| 中西区| 门头沟区| 大竹县|