@DIY李小龙图标的串口调试助手!

Python有强大的serial库,可以直接使用,已通过串口指令测试控制步进电机,转速,转向,相对位移,更改波特率等操作。

安装的时候是pyserial, pycharm安装页面如下:

实际调用的时候是 serial

import serial  #安装的是pyserial

先上一段测试视频:

Python制作的串口助手控制步进电机

DIY龙哥图标和图片

# 插入李小龙图片 ^_^self.photo = PhotoImage(file='bruce.png')self.photo_label = Label(self.init_window_name, image=self.photo)self.photo_label.place(x=40, y=280)

也添加了自己的网址

# 加入超链接def open_url(event):webbrowser.open_new("https://www.stepping-motor.cn")self.signature_label.bind("<Button-1>", open_url)

最后就是通过打包工具pyinstaller生成exe文件

pyinstaller -F -w -i logo.ico bruce.py

bruce.exe

拒绝套路,全部代码如下:

import tkinter
from tkinter import ttk, scrolledtext
from tkinter import *
import threading
import time
from datetime import datetime
import serial  #安装的是pyserial
import serial.tools.list_ports
import re
import webbrowserclass MY_GUI():# 构造函数def __init__(self, name):self.init_window_name = nameself.connected = False# 窗口控件设置初始化def set_init_window(self):self.init_window_name.title('Bruce(ComHelper)')self.init_window_name.geometry('740x620+220+10')self.init_window_name.resizable(False, False)self.init_window_name.attributes('-alpha', 1)# 新添加iconself.init_window_name.iconbitmap('wu.ico')# 串口选择控制框架self.com_choose_frame = Frame(self.init_window_name, width=10, height=100)self.com_choose_frame.place(x=20, y=12)# 1串口号标签self.com_label = Label(self.com_choose_frame, text='Serial Port: ')self.com_label.grid(row=1, column=0, sticky=W)# 串口号下拉框self.com_choose = StringVar()self.com_choose_combo = ttk.Combobox(self.com_choose_frame, width=12, textvariable=self.com_choose)self.com_choose_combo['state'] = 'readonly'self.com_choose_combo.grid(row=1, column=1, sticky=W + E, padx=12)self.com_choose_combo['values'] = self.com_name_get()# 串口框架内部按钮self.connect_button = Button(self.com_choose_frame, text='Open', bg='lightblue', width=12,command=self.com_connect)self.connect_button.grid(row=1, column=3, columnspan=2, padx=1, pady=4)# 2波特率标签self.baudrate_label = Label(self.com_choose_frame, text='Baud Rate: ')self.baudrate_label.grid(row=2, column=0, sticky=W, padx=2)# 波特率选项框self.baudrate_value = StringVar(value='9600')self.baudrate_choose_combo = ttk.Combobox(self.com_choose_frame, width=12, textvariable=self.baudrate_value)self.baudrate_choose_combo['values'] = ('4800', '9600', '19200', '38400', '57600', '115200')self.baudrate_choose_combo['state'] = 'readonly'self.baudrate_choose_combo.grid(row=2, column=1, sticky=W, padx=12)self.buttonN1 = Button(self.com_choose_frame, text='Confirm', bg='lightblue', width=12,command=self.get_baudrate)self.buttonN1.grid(row=2, column=3, columnspan=2, padx=1, pady=4)# 3数据位标签self.bytesize = Label(self.com_choose_frame, text='Byte Size: ')self.bytesize.grid(row=3, column=0, sticky=W, padx=2)# 数据位选项框self.bytesize_value = StringVar(value='8')self.bytesize_choose_combo = ttk.Combobox(self.com_choose_frame, width=12, textvariable=self.bytesize_value)self.bytesize_choose_combo['values'] = ('5', '6', '7', '8')self.bytesize_choose_combo['state'] = 'readonly'self.bytesize_choose_combo.grid(row=3, column=1, padx=2)self.buttonN2 = Button(self.com_choose_frame, text='Confirm', bg='lightblue', width=12, command=self.get_bytesize)self.buttonN2.grid(row=3, column=3, columnspan=2, padx=1, pady=4)# 4停止位标签self.stopbits = Label(self.com_choose_frame, text='Stop Bits: ')self.stopbits.grid(row=4, column=0, sticky=W, padx=2)# 停止位选项框self.stopbits_value = StringVar(value='1')self.stopbits_choose_combo = ttk.Combobox(self.com_choose_frame, width=12, textvariable=self.stopbits_value)self.stopbits_choose_combo['values'] = ('1', '1.5', '2')self.stopbits_choose_combo['state'] = 'readonly'self.stopbits_choose_combo.grid(row=4, column=1, padx=2)self.buttonN3 = Button(self.com_choose_frame, text='Confirm', bg='lightblue', width=12, command=self.get_stopbits)self.buttonN3.grid(row=4, column=3, columnspan=2, padx=1, pady=4)# 5校验位标签self.parity = Label(self.com_choose_frame, text='CRC: ')self.parity.grid(row=5, column=0, sticky=W, padx=4)# 校验位选项框self.parity_value = StringVar(value='None')self.parity_choose_combo = ttk.Combobox(self.com_choose_frame, width=12, textvariable=self.parity_value)self.parity_choose_combo['values'] = ('None', 'Odd', 'Even', 'Mark', 'Space')self.parity_choose_combo['state'] = 'readonly'self.parity_choose_combo.grid(row=5, column=1, padx=2, pady=2)self.buttonN1 = Button(self.com_choose_frame, text='Confirm', bg='lightblue', width=12, command=self.get_CRC)self.buttonN1.grid(row=5, column=3, columnspan=2, padx=1, pady=4)# 6 发送标签输入框和按钮self.command_label = Label(self.com_choose_frame, text='Command: ')self.command_label.grid(row=6, column=0, sticky=W, padx=4)self.command = Entry(self.com_choose_frame, width=15)self.command.insert(0, "ENA;")self.command.grid(row=6, column=1, padx=2, pady=2)self.command_send = Button(self.com_choose_frame, text='Send', bg='lightblue', width=12, command=self.com_send)self.command_send.grid(row=6, column=3, columnspan=2, padx=1, pady=4)# 插入签名,超链接和龙哥图片self.signature_label = Label(self.init_window_name, text='  www.stepping-motor.cn', font=('Monospace', 14),  cursor="hand2")self.signature_label.place(x=20, y=580)# 签名加入超链接def open_url(event):webbrowser.open_new("https://www.stepping-motor.cn")self.signature_label.bind("<Button-1>", open_url)# 插入李小龙图片 ^_^self.photo = PhotoImage(file='bruce.png')self.photo_label = Label(self.init_window_name, image=self.photo)self.photo_label.place(x=40, y=280)# 处理结果显示滚动文本框self.result_data_label = Label(self.init_window_name, text='  Output & Result')self.result_data_label.place(x=360, y=19)self.clear_button = Button(self.init_window_name, text='Clear', bg='lightblue', width=12,command=self.clear_result_text)self.clear_button.place(x=480, y=14)self.result_text = scrolledtext.ScrolledText(self.init_window_name, width=48, height=42)self.result_text.place(x=360, y=50)# 自动获取当前连接的串口名def com_name_get(self):self.port_list = list(serial.tools.list_ports.comports())self.com_port_names = []if len(self.port_list) > 0:for i in range(len(self.port_list)):self.com_name = str(self.port_list[i])self.com_port_names.append(self.com_name)return self.com_port_names# 打开串口按键的执行内容def com_connect(self):if self.connected:self.com_cancel()returnself.ser_name = str(self.com_choose.get())for i in range(len(self.port_list)):if self.ser_name == str(self.port_list[i]):self.ser_name, desc, hwid = self.port_list[i]self.result_text.insert(END, f"{datetime.now().strftime('%H:%M:%S.%f')[:-3]}: connecting{self.ser_name}\n")self.ser_baudrate = int(self.baudrate_value.get())self.ser_bytesize = int(self.bytesize_value.get())self.ser_stopbits = float(self.stopbits_value.get())self.ser_parity = str(self.parity_value.get())[0:1]try:self.ser = serial.Serial(port=self.ser_name, baudrate=self.ser_baudrate, bytesize=self.ser_bytesize,parity=self.ser_parity, stopbits=self.ser_stopbits)self.ser.timeout = 0.01self.result_text.insert(END, f"{datetime.now().strftime('%H:%M:%S.%f')[:-3]}:{self.ser_name}connected\n")#参数显示下^_^self.result_text.insert(END, f"Baud Rate:{self.get_baudrate()}\n")self.result_text.insert(END, f"Byte Size:{self.get_bytesize()}\n")self.result_text.insert(END, f"Stop Bits:{self.get_stopbits()}\n")self.result_text.insert(END, f"CRC:{self.get_CRC()}\n")self.result_text.see(tkinter.END)self.result_text.update()# 按钮变成“关闭串口”self.connected = Trueself.connect_button['text'] = 'Close'# 开启接收串口数据线程self.ReadUARTThread = threading.Thread(target=self.ReadUART, daemon=True)self.ReadUARTThread.start()except:newline = f"{datetime.now().strftime('%H:%M:%S.%f')[:-3]}:{self.ser_name}connection failed\n"self.result_text.insert(END, newline)self.result_text.see(tkinter.END)self.result_text.update()# 关闭串口按键的执行内容def com_cancel(self):try:self.ser.close()# 按钮变成“打开串口”self.connected = Falseself.connect_button['text'] = 'Open'except:newline = time.ctime(time.time()) + ':' + "Serial Port is not connected" + '\n'self.result_text.insert(END, newline)self.result_text.see(tkinter.END)self.result_text.update()def clear_result_text(self):self.result_text.delete('1.0', END)def ReadUART(self):try:while self.connected:newline = self.ser.readline()  # 字节类型if newline:# print(newline)self.result_text.insert(END,f"{datetime.now().strftime('%H:%M:%S.%f')[:-3]}{newline.decode('gbk')}\n")self.result_text.see(tkinter.END)self.result_text.update()except:# print(e)newline = f"{datetime.now().strftime('%H:%M:%S.%f')[:-3]}:{self.ser_name}is closed\n"self.result_text.insert(END, newline)self.result_text.see(tkinter.END)self.result_text.update()# 确认波特率等参数def get_baudrate(self):return self.baudrate_value.get()def get_bytesize(self):return self.bytesize_value.get()def get_stopbits(self):return self.stopbits_value.get()def get_CRC(self):return self.parity_value.get()def com_send(self):data = self.command.get()if data:self.writeSerial(data)def writeSerial(self, data):try:if self.connected and self.ser:# print(data)self.ser.write(data.encode('gbk'))self.ser.flush()newline = f"{datetime.now().strftime('%H:%M:%S.%f')[:-3]}{data}\n"self.result_text.insert(END, newline)self.result_text.see(tkinter.END)self.result_text.update()except:newline = f"{datetime.now().strftime('%H:%M:%S.%f')[:-3]}:{self.ser_name}data is not sent\n"self.result_text.insert(END, newline)self.result_text.see(tkinter.END)self.result_text.update()# 主线程
def start():init_window = Tk()my_window = MY_GUI(init_window)my_window.set_init_window()init_window.mainloop()start()
# 打包生成exe : pyinstaller -F -w -i logo.ico bruce.py

所需的文件在百度网盘里,py文件写好后,同目录下还需这两文件bruce.png 和 wu.ico

链接:https://pan.baidu.com/s/1-7gKzXF0sJyqnvw2WZoCmA

提取码:8h8q

Python通过RS232通讯控制步进电机相关推荐

  1. python控制小米电器以及ros通讯控制小米电器

    注意事项: IP最后一位会在附近跳动 182-183 相关工具 需要下载合适版本的米家,用电脑的手机模拟器,数据库软件查看获取的token 链接:https://pan.baidu.com/s/1ML ...

  2. python控制电机_树莓派Python控制步进电机

    步进电机控制在Python 玩了LED,开关和蜂鸣器后,我觉得自然的下一步是用步进电机或两个.这可能构成了一个想法的一部分,我不得不创建一个自动停止动画动画"转台",用于旋转和拍摄 ...

  3. python控制步进电机转动_用Python编程:控制步进电机+ Raspberry Pi零+ L293D IC

    (警告!我没有受过这个主题的教育) 嘿伙计.我之所以在这里发布,是因为我有一个非常需要她的项目帮助的朋友.我对脚本很熟悉,但是对编程却不太了解.我从事IT工作,所以我会尽力提供必要的信息.她正在尝试使 ...

  4. python控制树莓派马达_树莓派控制步进电机

    要想使用树莓派制作只能小车,需要先学会控制步进电机,下面就是用python控制28BJY-48步进电机和ULN2003控制板的代码: #!/usr/bin/python #引入需要的库 import ...

  5. python控制步进电机转动_python-树莓派通过按键控制步进电机正反转

    硬件选择与设计 不管是直流电机还是步进电机,如果想要让其进行正常的转动,必须需要驱动器进行驱动,所以我们在这里选择的步进电机和驱动板型号分别为28BYJ-48-5V和UL2003芯片的五线四相步进电机 ...

  6. CubieBoard通过GPIO控制步进电机-python

    2019独角兽企业重金招聘Python工程师标准>>> 1.首先你要编译并加载sun4i-gpio.ko驱动,如何编译:参考 < 如何编译单个驱动文件> 2.修改scri ...

  7. python控制电机_树莓派使用Python控制步进电机

    步进电机和普通电机最大的不同是步进电机可以更加精确地旋转,这个特性使得它们在各种树莓派项目中得到广泛运用. 步进电机选择 市面上有很多步进电机可供选择,最后我们还是决定使用ULN2003控制板和28B ...

  8. 51单片机蓝牙通讯精准控制步进电机简易教学

    51单片机蓝牙通讯精准控制步进电机 1.蓝牙模块 本次用到的蓝牙模块为HC-05,关于HC-05怎么配置的文章已经写过很多,这里就不一一介绍了,我下面具体讲一些关于单片机蓝牙数据的收发简单快捷的方法实 ...

  9. 三菱plc 与 计算机 通讯,PC与三菱PLC之间的RS232通讯协议

    <PC与三菱PLC之间的RS232通讯协议>由会员分享,可在线阅读,更多相关<PC与三菱PLC之间的RS232通讯协议(9页珍藏版)>请在人人文库网上搜索. 1.交流QQ:45 ...

最新文章

  1. 清华陈文光教授:AI 超算基准测试的最新探索和实践(附演讲视频)
  2. 数据纪实|颜强:疫情下的中国制造
  3. linux svn 撤销del,svn delete-删除文件和目录的实例
  4. CentOS下防御或减轻DDoS攻击方法(转)
  5. PHP安装TP6的composer install报Undefined index: process 进程依赖于proc_open 这个函数不可用
  6. 如何摆脱「自我否定」状态
  7. 用十行代码快速创建权限管理系统
  8. c语言程序编译成功运行失败,为什么这个程序编译成功但运行失败?
  9. zabbix 启动报cannot connect to Service Manager: [0x00000005]解决方法
  10. 流利说CFO辞职 公司上市一年多股价跌去一半
  11. java 双重检查锁定_Java双重检查锁定
  12. 锁, threading.local, 线程池, 生产者消费者模型
  13. Python BeautifuSoup4 爬表格
  14. Docker 配置加速器
  15. 程序员必备的 58 个学习网站
  16. Python程序编译为动态库pyd或so (适用于Windows和Linux)
  17. 云效·Insight(效能洞察)一款面向企业研发管理层的研发效能数字化度量服务
  18. 苹果硬盘分区不见了 容量有问题
  19. 郭天祥嵌入式开发教程
  20. 计算机毕业设计之java+ssm基于协同过滤算法的图书推荐系统

热门文章

  1. 2022年第十一届认证杯数学中国数学建模国际赛小美赛:D题野生动物贸易是否应该长期禁止建模方案及代码实现
  2. C++:带你搞定数组的疑难杂症--缓冲区溢出;数组越界;为什们打印内容能超出数组长度?
  3. target.tagName用法
  4. Anaconda的下载和使用
  5. C语言 for循环次数
  6. cad批量打印_CAD批量打图精灵入门教程--CAD批量打印、CAD批量转PDF
  7. 使用apifox进行接口并发测试
  8. 模仿网易云盾滑动验证码生成--抠图,大图部分背景透明
  9. arthas 复制粘贴快捷键
  10. 华为在线机试训练Python答案1-5题