【开源】一款PyQT+Pyserial开发的串口调试工具

2023-05-16

【开源】PyQT+Pyserial开发的串口调试工具

串口调试工具是我们做嵌入式开发常用的工具,市面上已经有很多串口调试工具了,博主写这款串口调试工具一方面是为了学习Python PyQT Pyserial 相关的知识,另一方面是也是可以为后续基于此设计更多的串口自动化工具。所以本文会详细介绍如何使用PyQT+Pyserial实现一款串口调试工具。

1. 安装开发环境

首先安装Python 3 环境,然后使用pip安装pyqt5 pyserial pyside2等需要的库

pip install pyqt5 pyserial PySide2

2. 设计UI

开发环境安装完成后,就可以进行GUI设计了,首先进入PySide2库的本地安装路径下

在这里插入图片描述

双击designer.exe文件,打开QT设计师

在这里插入图片描述

选择Main Window 或者Widget都可以。

接下来绘制QT界面,这部分不过多介绍,就是QT的常规使用。下面附上我的QT界面ui文件

https://download.csdn.net/download/hesuping/86750748

完成ui文件后,需要使用pyuic5命令将ui文件转化成python文件,这样才可以被python调用,转化的方式也很简单。PyQt 5安装成功后,pyuic5命令默认安装在Python安装包目录Scripts文件下, 执行如下命令,就可以将uart_ui.ui文件妆花成python文件uart_ui.py。

pyuic5 -o uart_ui.py uart_ui.ui

3. 串口逻辑实现

3.1 实例化类

使用面向对象思想,创建一个串口的类,并进行实例化。

if __name__ == '__main__':

	app = QApplication(sys.argv)

	ex = SerialTool()

	ex.show()

	sys.exit(app.exec_())

3.2 初始化程序

在SerialTool 类中的初始化中,分别执行初始化UI界面,刷新并初始化串口, 关键UI事件等操作,并创建定时发送的定时器。

	def __init__(self):
		super().__init__()

		self.setupUi(self)
		self.refreshPort()
		tmp = open('logo.png', 'wb')
		tmp.write(base64.b64decode(img))
		tmp.close()

		self.setWindowIcon(QIcon('logo.png'))
		os.remove('logo.png')

		self.InitUIEvent()
		self.initCOM()

		self.signalRecieve.connect(self.uart_receive_display)

		# #创建定时发送定时器
		self.timer_send= QTimer(self)
		self.timer_send.timeout.connect(self.UartSend)

3.3 串口刷新程序

	def refreshPort(self):
		self.com_list = []
		port_list = list(serial.tools.list_ports.comports())
		self.Combo_COM.clear()
		if len(port_list) > 0:
			for port_com in port_list:
				port_serial = list(port_com)[0]
				self.Combo_COM.addItem(port_serial)
				self.com_list.append(port_serial)
		else:
			self.Combo_COM.addItem('')

3.4 串口初始化程序

	def initCOM(self):
		self.l_serial = serial.Serial()
		if(len(self.com_list)):
			self.l_serial.port = self.com_list[0]
		self.l_serial.baudrate = int(self.Combo_Baudrate.currentText())
		self.l_serial.bytesize = int(self.Combo_Data_bit.currentText())
		self.l_serial.stopbits = int(self.Combo_Stop_bit.currentText())
		self.l_serial.parity = self.Combo_Parity.currentText()
		# serial.PARITY_NONE
		self.l_serial.timeout = 0.2

3.5 打开/关闭串口程序

	def StartComActivated(self):

		if self.l_serial.isOpen():
			self.timer_send.stop()
			# self.thread_read.join()
			self.l_serial.close()
			self.Button_Onoff_com.setText("打开串口")

			self.Combo_COM.setEnabled(True)
			self.Combo_Baudrate.setEnabled(True)
			self.Combo_Data_bit.setEnabled(True)
			self.Combo_Stop_bit.setEnabled(True)
			self.Combo_Parity.setEnabled(True)
		else:
			self.l_serial.open()
			self.Button_Onoff_com.setText("关闭串口")

			self.Combo_COM.setEnabled(False)
			self.Combo_Baudrate.setEnabled(False)
			self.Combo_Data_bit.setEnabled(False)
			self.Combo_Stop_bit.setEnabled(False)
			self.Combo_Parity.setEnabled(False)

			self.thread_read = None
			self.thread_read = threading.Thread(target=self.UartRead)
			self.thread_read.setDaemon(True)
			self.thread_read.start()

3.6 串口读取程序

	def UartRead(self):
		while self.l_serial.isOpen():
			num = self.l_serial.inWaiting()
			if num: 
				self.data = self.l_serial.read(num)
				if self.Box_Display_hex.checkState():        # 16进制接收
					hex_data=''
					for i in range(0, len(self.data)):
						hex_data = hex_data + '{:02X}'.format(self.data[i]) + ' '
					# self.Textbrowser_Receive.append(hex_data.strip())
					self.signalRecieve.emit(hex_data)
				else :
					# self.Textbrowser_Receive.append(data.decode().strip())
					# self.Textbrowser_Receive.insertPlainText(data.decode('utf-8',"ignore"))
					self.signalRecieve.emit(self.data)

			time.sleep(0.1)

3.7 串口显示程序

	def uart_receive_display(self,obj):
		now_time = datetime.now()  # 获取当前时间
		new_time = now_time.strftime('[%H:%M:%S:%f]')
		if self.Box_Display_hex.checkState():         # hex显示
			if(self.Box_Display_time.checkState()):   # 显示时间
				self.recv_data = '\r\n'+ new_time + obj.strip()
			else:
				self.recv_data = obj.strip()
			if self.Box_Display_send.checkState():    # 显示发送
				self.recv_data = '\r\n' + '[Receive]:' + self.recv_data

			if self.Box_Auto_wrap.checkState():
				self.Textbrowser_Receive.append(self.recv_data)
			else:
				self.Textbrowser_Receive.insertPlainText(self.recv_data)
				# self.Textbrowser_Receive.append(self.recv_data)
		else:
			if self.Box_Display_time.checkState():
				self.recv_data = '\r\n' + new_time + obj.decode('utf-8',"ignore")
			else:
				self.recv_data = obj.decode('utf-8',"ignore")

			if self.Box_Display_send.checkState():
				self.recv_data = '\r\n' + '[Receive]:' + self.recv_data

			if self.Box_Auto_wrap.checkState():
				self.Textbrowser_Receive.append(self.recv_data)
			else:
				self.Textbrowser_Receive.insertPlainText(self.recv_data)

		self.Textbrowser_Receive.moveCursor(self.Textbrowser_Receive.textCursor().End)  #文本框显示到底部

3.8 串口发送程序

	def UartSend(self):
		InputStr = self.TextEdit_Send.toPlainText()
		if InputStr == "":
			return

		if self.Box_Display_send.checkState():
			self.recv_data = '[Send]:'+ InputStr
			self.Textbrowser_Receive.append(self.recv_data)

		if self.Box_Hex_send.checkState():
			#发送十六进制数据
			InputStr = InputStr.strip() #删除前后的空格
			send_list=[]
			while InputStr != '':
				try:
					num = int(InputStr[0:2], 16)
					
				except ValueError:
					QMessageBox.critical(self, 'pycom','请输入十六进制数据,以空格分开!')
					return None
				
				InputStr = InputStr[2:]
				InputStr = InputStr.strip()
				
				#添加到发送列表中
				send_list.append(num)
			InputStr = bytes(send_list)

			self.l_serial.write(InputStr)
		else :
			self.l_serial.write(InputStr.encode())

4. 串口工具

完成后的串口工具如下图:

在这里插入图片描述

界面中显示的功能都已经完成,其他的功能还在陆续开发中。 欢迎大家关注及提意见。 目前该工具功能还很基础和粗糙,但是很适合用于学习。工具的全部源码我也已经放在了github中,欢迎STAR及留言。

github地址: https://github.com/HESUPING/IOT_COM

安装包:https://github.com/HESUPING/IOT_COM/releases/download/V1.0/IOT_COM.exe

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【开源】一款PyQT+Pyserial开发的串口调试工具 的相关文章

  • docker的迁移备份

    在工作中 xff0c 有时候可能需要把正在运行的容器 xff0c 迁移到另外一台服务器上 或者需要把某个容器备份 本文档记录docker如何迁移和备份容器 容器保存为镜像 下面是我虚拟机中正在运行的容器 以mynginx容器为例 xff0c
  • 技术面试(一)认识技术面试

    面试这件事听起来似乎挺简单 xff0c 做起来却非常困难 不妨先听听面试官的真实 吐槽 xff1a 是不是拿算法题让候选人做就好了 xff1f 可如果他做过这个题目怎么办 xff1f 候选人都是工作好多年的老司机了 xff0c 怎么有面试官
  • Pix4飞控硬件平台框架(一)

    硬件平台简介 本文只是为了让大家简单入门为主 xff0c 所以我选择的硬件学习平台是Pixhawk系列的mRoPixhawk xff0c 兼容原始版本Pixhawk1 xff0c 基于Pixhawk project FMUv3开源硬件设计
  • Pix4飞控常见问题解决方法(二)

    一 无法解锁 xff08 黄灯闪烁 xff09 无法解锁的原因会有多种 xff0c 请按照如下步骤进行检查 xff1a 1 初始设置是否全部完成 a 机架类型选择是否正确 xff0c 或者你根本就没有选择 xff1f 注意 xff0c 新版
  • 基于libuvc的相机配置说明

    很多相机支持uvc 1 的传输格式 ros官网自带的libuvc xff0c 支持uvc格式的视频流 xff0c 本文主要对这个链接中的一些细节 xff0c 进行补充说明 step 1 插入usb step 2 获取基本信息 查找camer
  • Ehcache依赖版本问题:Another CacheManager with same name 'es' already exists in the same VM.

    最近在写一个shiro 的demo用到Ehcache缓存配置 结果在启动项目的时候出错 span style font size 14px Caused by net sf ehcache CacheException Another Ca
  • ubuntu 创建新用户并添加到docker组

    useradd myuser passwd myuser first create the directory mkdir p home myuser usermod s bin bash d home myuser myuser cp r
  • SM2 签名前要进行的预处理操作

    一般情况下 xff0c 计算数字签名时应执行以下操作 xff1a 1 计算原始数据的 Hash 值 xff1b 2 将 Hash 值作为输入 xff0c 计算签名函数的输出 并不是对原始数据直接签名 xff0c 而是对 Hash 值签名 验
  • VR行业的发展现状和前景

    5G技术的应用推广 xff0c 加速推动虚拟现实不断发展和完善 xff0c VR产业迅速在各个领域和行业都得到广泛应用 xff0c 最好直观的感受就是知觉体验得到了良好的增强作用 本文的主要内容是简单概括VR技术的发展现状和发展前景 一 V
  • Intel真情告白:我的眼里只有你 –UP Squared Board

    近期 xff0c 物联网领域最大的喜讯莫过于研扬科技携手Intel 共同推出一款 UP SQUARED GROVE 物联网开发套件 对于这次喜结良缘 xff0c Intel 官网也是不加修饰的大方昭告天下 xff1a 我的眼里只有你 xff
  • 【问题与方法】联想拯救者双系统重启卡死机解决方案

    码字不易 xff0c 如果各位看官感觉该文章对你有所帮助 xff0c 麻烦点个关注 xff0c 如果有任何问题 xff0c 请留言交流 如需转载 xff0c 请注明出处 xff0c 谢谢 文章链接 xff1a 问题与方法 联想拯救者双系统重
  • 【深度学习】训练集、测试集和验证集

    码字不易 xff0c 如果各位看官感觉该文章对你有所帮助 xff0c 麻烦点个关注 xff0c 如果有任何问题 xff0c 请留言交流 如需转载 xff0c 请注明出处 xff0c 谢谢 文章链接 xff1a https blog csdn
  • 【深度学习】ubuntu系统指定gcc版本并调整优先级

    sudo apt install build essential gcc version xff08 查看gcc版本 xff09 可以看到我的gcc版本是4 8 5 安装最新版gcc9 sudo apt install software p
  • 【深度学习】Ubuntu增加Swap交换空间大小

    前言 xff1a 做Ubuntu系统时 xff0c 选择了默认空间分配方案 xff0c Swap空间仅2G xff0c 而你的内存有16G xff0c 分给Swap空间至少为内存的1倍 xff0c 最好是内存值的2倍 xff0c 系统相当卡
  • 【论文阅读】Anchor3DLane: Learning to Regress 3D Anchors for Monocular 3D LaneDetection

    Anchor3DLane 针对单目的3D车道线检测去学习回归3D锚 摘要 xff1a 单目的3D车道线检测是一个非常具有挑战性的问题 xff0c 因为他缺少深度的信息 xff0c 3D车道线检测一个非常流行的方法是将前视图转换成鸟瞰图 xf
  • 【深度学习】训练模型结果同时显示,模型结果对比

    码字不易 xff0c 如果各位看官感觉该文章对你有所帮助 xff0c 麻烦点个关注 xff0c 如果有任何问题 xff0c 请留言交流 如需转载 xff0c 请注明出处 xff0c 谢谢 文章链接 xff1a 深度学习 训练模型结果同时显示
  • 【问题与方法】如何使用vscode配置远程git仓库

    码字不易 xff0c 如果各位看官感觉该文章对你有所帮助 xff0c 麻烦点个关注 xff0c 如果有任何问题 xff0c 请留言交流 如需转载 xff0c 请注明出处 xff0c 谢谢 配置git xff0c 看我这一篇其实就够了 问题与
  • 【车道线算法】GANet-车道线检测环境配置一文通关

    目录 GANet配置全纪录 下载代码 conda环境部署 安装torch和cudatoolkit 安装其他包 编译 总结 GANet配置全纪录 下载代码 GitHub Wolfwjs GANet A Keypoint based Globa
  • 【雷达】如何将三维点云映射到二维平面

    最近在做基于雷达点云的交通标识牌识别时 xff0c 需要按照HAD格式进行输出 xff0c 由于交通标识牌不一定会与坐标轴垂直 xff0c 那么如何找到矩形标识牌的四个顶点 xff0c 是待解决的问题 由于标识牌一定是平面的 xff0c 三
  • ceres 拟合曲线

    假设有一条满足以下方程的曲线 xff1a 其中a b c为曲线的参数 xff0c w为高斯噪声 这是一个非线性模型 假设我们有N个关于x y的观测数据点 xff0c 想根据这些数据点求出曲线的参数 那么 xff0c 可以求解下面的最小二乘问

随机推荐

  • 独家!了不起的UP系列产品,不一样的开发板—UP Board(一)

    AAEON自2016年推出第一代UP board问世以来 xff0c 其信用卡大小的苗条小身材 xff08 世界首创Intel平台信用卡大小开发板 xff09 xff0c 配备上Intel Atom x5 z8350 处理器 xff0c 兼
  • 追求技术之路 - 那些陪伴我的书籍

    如今已经在广州一家嵌入式公司实习 xff0c 分享大学里度过的一些书籍 xff0c 有些还没读完 xff0c 个人比较喜欢经典书籍 xff0c 研读起来就有种奇妙的感觉 xff0c 比起人与人之间的复杂的关系 xff0c 书籍带给我的感觉很
  • 编程之美 -- 中国象棋将帅问题

    下过中国象棋的朋友都知道 xff0c 双方的 将 和 帅 相隔遥远 xff0c 并且它们不能照面 在象棋残局中 xff0c 许多高手能利用这一规则走出精妙的杀招 假设棋盘上只有 将 和 帅 二子 xff08 为了下面叙述方便 xff0c 我
  • C++单元测试工具 -- CppUnit

    CppUnit 作为C 43 43 语言的一款测试工具 xff0c 其实也是一个开源项目 xff0c 与JUnit一样 xff0c 用来方便开发人员进行单元测试的工具 项目地址 xff1a http sourceforge net apps
  • 拒绝游戏!发愤图强!

    立帖为证 xff01 xff01 xff01
  • C++ STL — 第6章 STL容器(二)deque

    C 43 43 STL容器deque和vector很类似 xff0c 也是采用动态数组来管理元素 使用deque之前需包含头文件 xff1a include lt deque gt 它是定义在命名空间std内的一个class templat
  • C++ STL — 第6章 STL容器(三)list

    一 list基础 List使用一个双向链表来管理元素 图一显示了list的结构 图一 list的结构 任何型别只要具备赋值和可拷贝两种性质 xff0c 就可以作为list的元素 二 list的功能 list的内部结构和vector和dequ
  • STL list remove和sort函数

    include lt iostream gt include lt list gt include lt iterator gt using namespace std bool cmp int a int b return a gt b
  • 排序 -- 简单选择排序

    选择排序 思想 xff1a 每一趟 n i 43 1 xff08 i 61 1 2 3 n 1 xff09 个记录中选择关键字最小的记录作为有序序列的第i个记录 简单选择排序 xff1a 通过n i次关键字间的比较 xff0c 从n i 4
  • HDOJ 1106 排序

    题目地址 xff1a http acm hdu edu cn showproblem php pid 61 1106 Problem xff1a 输入一行数字 xff0c 如果我们把这行数字中的 5 都看成空格 xff0c 那么就得到一行用
  • Jetson Xavier、Jetson TX2、 1080(Ti)、2080显卡运行深度学习模型性能对比(英伟达开发平台VS常用显卡)

    前言 xff1a 英伟达的Jetson TX2使得很多人认为深度学习模型终于可以像嵌入式开发平台那样做到小型化了 xff0c 不用再跑在高配计算机或者服务器上面了 xff0c 但是实际上Jetson TX2开发板的性能和深度学习常用到的10
  • 独家!了不起的UP系列产品,不一样的开发板 — UP Squared Board(二)

    UP 系列家族的成员 xff0c 经过团队经年累月的精心研发 xff0c 产品已不断丰富起来 先后开发出了第二代产品UP Squared 与第一代产品UP Board相比 xff0c 拥有 高性能低功耗的 UP Squared 似乎更令人兴
  • STM32连接--OneNET,阿里云(MQTT协议)详细教程

    x1f495 对于物联网工程 xff0c 不可或缺的必然是连接上云 xff0c 今天本人总结了上云经验 xff0c 希望对大家起到帮助哦 有用的话记得点赞收藏哦 关于如何连接OneNET OneNET https open iot 1008
  • HTTP Digest接入方式鉴权认证流程

    HTTP Digest接入方式鉴权认证流程 一 摘要认证原理 摘要认证与基础认证的工作原理很相似 xff0c 用户先发出一个没有认证证书的请求 xff0c Web服务器回复一个带有WWW Authenticate头的响应 xff0c 指明访
  • 6.2随笔

    今天打牛客 xff0c 用python写了一题 xff0c 结果发现用空格隔开的两个数不知道怎么输入 代码 xff1a n span class token punctuation span m span class token opera
  • 蓝牙Mesh简介

    蓝牙mesh简介 蓝牙Mesh的基本概念 蓝牙Mesh是2017年7月蓝牙技术联盟 xff08 Bluetooth SIG xff09 正式推出的蓝牙设备组网标准 我们知道蓝牙ble设备可以与其他设备建立GATT连接 xff0c 然后进行
  • 蓝牙Mesh的基本概念

    蓝牙mesh简介 蓝牙Mesh的基本概念 蓝牙Mesh是基于ble广播进行消息传递的一种蓝牙组网通讯网络 xff0c 是一种采用网络洪泛的方式无中心 无路由的对等网络 以实现蓝牙设备与蓝牙设备之间的多对多通讯 xff0c 使蓝牙在物联网智能
  • JLink Commander调试方法

    JLink Commander调试方法 1 背景 目前开发中常用的调试手段主要有串口 IO口输出作为调试方式 目前串口的限制较多 xff0c 有些硬件不太方便接串口或者一些实时的数据 xff0c 当时没有接串口则无法实时获取调试信息 IO调
  • 物联网安全系列 - 非对称加密算法 ECDH

    非对称加密算法 ECDH 背景 之前的章节讲到了对称加密算法AES xff0c 发送方和接收方需要使用相同的密钥进行通讯 xff0c 但是发送方怎么将密钥安全的发送给接收方 xff1f 这是一个问题 密钥分配问题 对称加密算法中 xff0c
  • 【开源】一款PyQT+Pyserial开发的串口调试工具

    开源 PyQT 43 Pyserial开发的串口调试工具 串口调试工具是我们做嵌入式开发常用的工具 xff0c 市面上已经有很多串口调试工具了 xff0c 博主写这款串口调试工具一方面是为了学习Python PyQT Pyserial 相关