使用python实现一个简陋的上位机

import tkinter as tk
from tkinter import ttk
import serial  # 导入模块
import threading
import serial.tools.list_ports
import base64
import os

def serialRead(ser):
    # 有可能与串口测试部分冲突,需要将此设置为最高级别
    while True:  # 读是一直读,写是有限次
        count = ser.inWaiting()
        if count > 0:
            try:
                data = ser.read(count).decode(encoding='utf-8')
                accept_area.config(state='normal')
                accept_area.insert('end', data)
                accept_area.config(state='disabled')
            except Exception as e:
                error_label['text'] = str(e)


from icon import img
win = tk.Tk()
win.title("一个简陋的上位机")  # 添加标题
win.geometry('400x430')
win.resizable(False,False)

error_label = tk.Label(win, text="运行状态", )
error_label.grid(column=0, row=0, columnspan=4)
ttk.Label(win, text="波特率").grid(column=1, row=1)
ttk.Label(win, text="端口号").grid(column=0, row=1)


def add_n(message):
    message_list = list(message)
    for i in range(len(message)):
        if i % 30 == 0:
            message_list.insert(i, '\n')
    return ''.join(message_list)


def open_uart():
    try:
        global ser
        timex = 5
        # 打开串口,并得到串口对象
        ser = serial.Serial(number1.get(), number.get(), timeout=timex)
        error_label['text'] = "串口打开成功"
        ReadThread = threading.Thread(target=serialRead, args=(ser,))
        ReadThread.daemon = True
        ReadThread.start()
    except Exception as e:
        error_label['text'] = add_n(str(e))
        pass


def close():
    try:
        global ser
        ser.close()
        error_label.configure(text="串口关闭成功")
    except Exception as e:
        error_label.configure(text=add_n(str(e)))
        pass


button_open = ttk.Button(win, text="打开串口", command=open_uart)
button_open.grid(column=2, row=2)

button_close = ttk.Button(win, text="关闭串口", command=close)
button_close.grid(column=3, row=2)

port_list = list(serial.tools.list_ports.comports())
port_list_names = [i.name for i in port_list]

number1 = tk.StringVar()
numberChosen = ttk.Combobox(win, width=12, textvariable=number1, state='readonly')
numberChosen['values'] = port_list_names
numberChosen.grid(column=0, row=2)
numberChosen.current(0)

number = tk.StringVar()
numberChosen = ttk.Combobox(win, width=12, textvariable=number, state='readonly')
numberChosen['values'] = (
50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200) 
numberChosen.grid(column=1, row=2) 
numberChosen.current(12)

ttk.Label(win, text="发送区").grid(column=0, row=3, columnspan=2,)  # 添加一个标签0
send_area = tk.Text(win, width=30, height=10, )
send_area.grid(column=0, row=4, columnspan=2, rowspan=2)


def send():
    try:
        data = send_area.get('1.0', 'end')
        global ser

        # print(repr(data))
        ser.write(data[:-1].encode("ascii"))
        error_label['text'] = "%s 发送成功" % data
    except Exception as e:
        error_label['text'] = add_n(str(e))
        pass

def send_clear():
    try:
        send_area.delete('1.0', 'end')
        error_label['text'] = "发送区清空成功"
    except Exception as e:
        error_label['text'] = add_n(str(e))
        pass

button_send = ttk.Button(win, text="发送数据", command=send)
button_send.grid(column=2, row=4, columnspan=2)

button_send_clear = ttk.Button(win, text="清空发送区", command=send_clear)
button_send_clear.grid(column=2, row=5, columnspan=2)

ttk.Label(win, text="接收区").grid(column=0, row=6, columnspan=2,)
accept_area = tk.Text(win, width=30, height=10, )
accept_area.grid(column=0, row=7, columnspan=2, rowspan=2)
accept_area.config(state='disabled')

def accept_clear():
    try:
        accept_area.config(state='normal')
        accept_area.delete('1.0', 'end')
        accept_area.config(state='disabled')
        error_label['text'] = "接收区清空成功"
    except Exception as e:
        error_label['text'] = add_n(str(e))
        pass


button_accept_clear = ttk.Button(win, text="清空接收区", command=accept_clear)
button_accept_clear.grid(column=2, row=7, columnspan=2, rowspan=2)


win.mainloop()  # 当调用mainloop()时,窗口才会显示出来

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值