PyCharm pyqt5 python串口通信封装类SerialCommunication

"""
pyqt5串口通信文件SerialCommunication.py
"""
import binascii
import os
import serial
import serial.tools.list_ports
from PyQt5.QtGui import QPixmap# 全局变量,串口是否创建成功标志
Ret = False
# 串口列表串口号
port_list_number = []
# 串口列表名称
port_list_name = []
# 获取“串口指示灯亮”图片文件路径
imgLedOff = os.path.join(os.getcwd() + "\\images\\light_off.png")
# 获取“串口指示灯灭”图片文件路径
imgLedOn = os.path.join(os.getcwd() + "\\images\\light_on.png")class Communication(object):"""Python串口通信封装类"""# 初始化def __init__(self, com, bps, timeout):self.port = com  # 串口号self.bps = bps  # 波特率self.timeout = timeout  # 超时溢出self.main_engine = None  # 全局串口通信对象global RetRet = Falseself.data = Noneself.b_c_text = Nonetry:# 打开串口,并得到串口对象self.main_engine = serial.Serial(self.port, self.bps, timeout=self.timeout)# 判断是否打开成功if self.main_engine.is_open:Ret = Trueexcept Exception as e:print("---异常---:", e)# 打印设备基本信息def Print_Name(self):"""打印设备基本信息"""print(self.main_engine.name)  # 设备名字print(self.main_engine.port)  # 读或者写端口print(self.main_engine.baudrate)  # 波特率print(self.main_engine.bytesize)  # 字节大小print(self.main_engine.parity)  # 校验位print(self.main_engine.stopbits)  # 停止位print(self.main_engine.timeout)  # 读超时设置print(self.main_engine.writeTimeout)  # 写超时print(self.main_engine.xonxoff)  # 软件流控print(self.main_engine.rtscts)  # 软件流控print(self.main_engine.dsrdtr)  # 硬件流控print(self.main_engine.interCharTimeout)  # 字符间隔超时# 打开串口def Open_Engine(self):"""打开串口"""global Ret# 如果串口没有打开,则打开串口if not self.main_engine.is_open:self.main_engine.open()Ret = True# 关闭串口def Close_Engine(self):"""关闭串口"""global Ret# print(self.main_engine.is_open)  # 检验串口是否打开# 判断是否打开if self.main_engine.is_open:self.main_engine.close()  # 关闭串口Ret = False# 打印可用串口列表@staticmethoddef Print_Used_Com():"""打印可用串口列表"""port_list_name.clear()port_list_number.clear()port_list = list(serial.tools.list_ports.comports())if len(port_list) <= 0:print("The Serial port can't find!")else:for each_port in port_list:port_list_number.append(each_port[0])port_list_name.append(each_port[1])print(port_list_number)print(port_list_name)# 接收指定大小的数据# 从串口读size个字节。如果指定超时,则可能在超时后返回较少的字节;如果没有指定超时,则会一直等到收完指定的字节数。def Read_Size(self, size):"""接收指定大小的数据:param size::return:"""return self.main_engine.read(size=size)# 接收一行数据# 使用readline()时应该注意:打开串口时应该指定超时,否则如果串口没有收到新行,则会一直等待。# 如果没有超时,readline会报异常。def Read_Line(self):"""接收一行数据:return:"""return self.main_engine.readline()# 发数据def Send_data(self, data):"""发数据:param data:"""self.main_engine.write(data)# 更多示例# self.main_engine.write(bytes(listData))  # 发送列表数据listData = [0x01, 0x02, 0xFD]或listData = [1, 2, 253]# self.main_engine.write(chr(0x06).encode("utf-8"))  # 十六制发送一个数据# print(self.main_engine.read().hex())  #  # 十六进制的读取读一个字节# print(self.main_engine.read())#读一个字节# print(self.main_engine.read(10).decode("gbk"))#读十个字节# print(self.main_engine.readline().decode("gbk"))#读一行# print(self.main_engine.readlines())#读取多行,返回列表,必须匹配超时(timeout)使用# print(self.main_engine.in_waiting)#获取输入缓冲区的剩余字节数# print(self.main_engine.out_waiting)#获取输出缓冲区的字节数# print(self.main_engine.readall())#读取全部字符。# 接收数据# 一个整型数据占两个字节# 一个字符占一个字节def Receive_data(self, way):"""接收数据:param way:"""# 循环接收数据,此为死循环,可用线程实现print("开始接收数据:")bWaitRec = Truewhile bWaitRec:try:# 一个字节一个字节的接收if self.main_engine.in_waiting:if way == 0:for i in range(self.main_engine.in_waiting):print("接收ascii数据:" + str(self.Read_Size(1)))data1 = self.Read_Size(1).hex()  # 转为十六进制data2 = int(data1, 16)  # 转为十进制print("收到数据十六进制:"+data1+"  收到数据十进制:"+str(data2))if way == 1:# 整体接收# self.data = self.main_engine.read(self.main_engine.in_waiting).decode("utf-8")  # 方式一self.data = self.main_engine.read_all()  # 方式二print("接收ascii数据:", self.data)self.b_c_text = binascii.hexlify(self.data)  # 16进制Bytes转Bytes,例:b'\x01\x06\xaa\x92\x12'转b'0106aa9212'print("Bytes数据:", self.b_c_text)# 如果data不为空,则退出接收死循环if self.data.strip() != '':bWaitRec = Falseexcept Exception as e:print("异常报错:", e)print("接收数据完毕!")
"""
pyqt5主对话框文件main.py
"""import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtGui import QPixmap
import SerialCommunication  # module SerialCommunication.py# myPyMainForm  # 主窗口对象
# labIndicator  # label控件对象class MyPyQTMainForm(QMainWindow, BitmapFontCreate.Ui_MainWindow):"""主界面"""def __init__(self):super(MyPyQTMainForm, self).__init__()self.setupUi(self)# 保存全局串口通信Communication对象self.myEngine = Noneself.strComNum = None  # 保存串口号def ComLedIndicator(self, comboIndex):"""串口状态用LED指示灯指示。串口打开LED亮;串口关闭LED灭;"""if comboIndex >= 0:# 计算串口号COMxself.strComNum = SerialCommunication.port_list_number[comboIndex]# 创建串口通信对象myEngineself.myEngine = SerialCommunication.Communication(self.strComNum, 9600, 0.5)else:self.myEngine = Noneif SerialCommunication.Ret:# 利用label显示图片,串口指示灯亮icoLedOn = QPixmap(SerialCommunication.imgLedOn)myPyMainForm.labIndicator.setPixmap(icoLedOn)myPyMainForm.labIndicator.setScaledContents(True)else:# 利用label显示图片,串口指示灯灭icoLedOff = QPixmap(SerialCommunication.imgLedOff)myPyMainForm.labIndicator.setPixmap(icoLedOff)myPyMainForm.labIndicator.setScaledContents(True)def ComScan(self):"""串口扫描"""# 串口重新扫描前,首先关闭串口if self.myEngine:self.myEngine.Close_Engine()# 清空串口组合框myPyMainForm.comboComNum.clearEditText()myPyMainForm.comboComNum.clear()# 打印可用串口列表SerialCommunication.Communication.Print_Used_Com()# 向串口号组合框添加可用的串口号myPyMainForm.comboComNum.addItems(SerialCommunication.port_list_name)"""
主函数
"""
if __name__ == '__main__':app = QApplication(sys.argv)myPyMainForm = MyPyQTMainForm()# 禁止最大化按钮myPyMainForm.setWindowFlags(QtCore.Qt.WindowMinimizeButtonHint | QtCore.Qt.WindowCloseButtonHint)# 禁止拉伸窗口大小myPyMainForm.setFixedSize(myPyMainForm.width(), myPyMainForm.height())# 清空串口号组合框myPyMainForm.comboComNum.clear()# 打印可用串口列表SerialCommunication.Communication.Print_Used_Com()# 向串口号组合框添加可用的串口号myPyMainForm.comboComNum.addItems(SerialCommunication.port_list_name)# 显示主界面myPyMainForm.show()sys.exit(app.exec_())

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/546807.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Fiddler利用Xposed框架+JustTrustMe抓取手机APP数据

文章目录 1. Xposed安装2. JustTrustMe安装3. 确保Fiddler在模拟器里配置 此文只是针对Fiddler抓取APP数据失败情况下的方案&#xff0c;主要想解决的是安卓手机APP抓包HTTPS报文通过MITM代理后证书不被信任的问题。网上搜索出这是使用了SSL Pinning技术&#xff0c;网上可以搜…

互动直播的视频录制与合成—支持多人离线重入

实现的效果图&#xff1a; 上图合成了2个人视频&#xff0c;中途有1个人先离开之后又重新加入了房间。 一、业务场景 业务场景是这样的&#xff1a;多个用户&#xff08;2-4人&#xff09;直播的视频&#xff0c;合成为一个视频&#xff0c;这期间要满足2个条件&#xff1a;首…

Python界面 PyQT可视化开发(python3+PyQt5+Qt Designer)

前言 以前制作一个Python窗体界面&#xff0c;我都是用GUI窗口视窗设计的模块Tkinter一点一点敲出来的&#xff0c;今天朋友问我有没有Python窗体的设计工具&#xff0c;“用鼠标拖拖”就能完成窗体设计&#xff0c;我查了查相关资料&#xff0c;果然有一款好用的工具——Qt De…

JVM(三)对象的生死判定和算法详解

好的文章是能把各个知识点&#xff0c;通过逻辑关系串连起来&#xff0c;让人豁然开朗的同时又记忆深刻。 导读&#xff1a;对象除了生死之外&#xff0c;还有其他状态吗&#xff1f;对象真正的死亡&#xff0c;难道只经历一次简单的判定&#xff1f;如何在垂死的边缘“拯救”一…

【STM32】修改芯片型号后报 Error 的解决方案

原文&#xff1a;https://blog.csdn.net/xiuhua_wu/article/details/85237418 背景 前几天有个新需求&#xff0c;使用 STM32 的标准库&#xff08;STD&#xff09;做个产品的例程。之前已经做了个 HAL 的&#xff0c;但人家客户不干&#xff0c;非要 STD 的。拖了一周&#xf…

Python手写神经网络实现3层感知机

一、BP神经网络结构模型 BP算法的基本思想是&#xff0c;学习过程由信号的正向传播和误差的反向传播俩个过程组成&#xff0c;输入从输入层输入&#xff0c;经隐层处理以后&#xff0c;传向输出层。如果输出层的实际输出和期望输出不符合&#xff0c;就进入误差的反向传…

JVM(四)垃圾回收的实现算法和执行细节

全文共 1890 个字&#xff0c;读完大约需要 6 分钟。 上一篇我们讲了垃圾标记的一些实现细节和经典算法&#xff0c;而本文将系统的讲解一下垃圾回收的经典算法&#xff0c;和Hotspot虚拟机执行垃圾回收的一些实现细节&#xff0c;比如安全点和安全区域等。 因为各个平台的虚拟…

python-cx_oracle报错“DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be loaded: “

问题的主要原因是python-cx_oracle加载的是32位的instantclient-basic&#xff0c;我们需要让他读到64位的。 弄清版本&#xff0c;最重要&#xff01;&#xff01;&#xff01; 首先安装配置时&#xff0c;必须把握一个点&#xff0c;就是版本一致&#xff01;包括&#xff1…

JVM(五)垃圾回收器的前世今生

全文共 2195 个字&#xff0c;读完大约需要 8 分钟。 如果垃圾回收的算法属于内存回收的方法论的话&#xff0c;那本文讨论的垃圾回收器就属于内存回收的具体实现。 因为不同的厂商&#xff08;IBM、Oracle&#xff09;&#xff0c;实现的垃圾回收器各不相同&#xff0c;而本文…

【SlowFast复现】SlowFast Networks for Video Recognition复现代码 使用自己的视频进行demo检测

目录 一&#xff0c;准备 1.1代码1.2 环境准备1.3 搭建镜像1.4 配置slowfast环境1.5 ava.json1.6 SLOWFAST_32x2_R101_50_50.yaml1.7 SLOWFAST_32x2_R101_50_50 .pkl二&#xff0c;代码运行三 错误解决复现过程视频&#xff1a;B站复现视频复现结果 一&#xff0c;准备 1.1代…

MySQL学生向笔记以及使用过程问题记录(内含8.0.34安装教程

MySQL 只会写代码 基本码农 要学好数据库&#xff0c;操作系统&#xff0c;数据结构与算法 不错的程序员 离散数学、数字电路、体系结构、编译原理。实战经验&#xff0c; 高级程序员 去IOE&#xff1a;去掉IBM的小型机、Oracle数据库、EMC存储设备&#xff0c;代之以自己在开源…

程序员专属精品简历合集—面试必备

听说你最近打算换工作&#xff1f;听说你和好工作之间&#xff0c;只差一个漂亮的简历模板&#xff1f;人们常说“金三银四”&#xff0c;一年之际在于春。不管你是主动离职&#xff0c;还是被动“被离职”&#xff08;稳住&#xff0c;我们能赢&#xff01;&#xff09;&#…

ubuntu20.10下wine安装微信

1.unbuntu20.04下安装wine sudo apt-get install wine2.微信官网http://short.weixin.qq.com/下载window系统微信软件 3.在wine中安装微信 在WeChatSetup.exe文件中打开终端输入&#xff1a; wine WeChatSetup.exe

【faster rcnn 实现via的自动框人】使用detectron2中faster rcnn 算法生成人的坐标,将坐标导入via(VGG Image Annotator)中,实现自动框选出人的区域

前言 B站讲解视频 我的研究生毕业论文方向就是时空行为检测&#xff0c;所以&#xff0c;slowfast和ava是我重点搞的&#xff0c;我的博客主页也有很多这些相关内容。 终于&#xff0c;到了标注数据这一块了&#xff0c;为了更简单的标注数据&#xff0c;我要做的这部分的数据…

程序员精美简历Top榜—面试必备

听说你最近打算换工作&#xff1f;听说你和好工作之间&#xff0c;只差一个漂亮的简历模板&#xff1f; 不管是主动离职&#xff0c;还是“被离职”&#xff08;稳住&#xff0c;我们能赢&#xff01;&#xff09;&#xff0c;趁着大好时光和对新年的憧憬&#xff0c;再找一个…

失败创业者的告白:初创团队应有一位绝对领导者

做了两年的项目失败了&#xff0c;我们的项目做的是数码3C的优惠信息&#xff0c;我是一个80后&#xff0c;小硕一枚;我们的1号创始人是90后&#xff0c;有激情、有梦想;在十八岁那年带上他的梦想千里北上&#xff0c;找我们的开复老师指点一二;但那时&#xff0c;开复老师正为…

【ffmpeg裁剪视频faster rcnn自动检测 via】全自动实现ffmpeg将视频切割为图片帧,再使用faster rcnn将图片中的人检测出来,最后将检测结果转化为via可识别的csv格式

目录 前言一&#xff0c;ffmpeg 自动裁剪 1.1 目录结构1.2 cutVideoToImage.sh1.2 myVideo1.3 myVideo15mins1.5 myFrames1.6 运行1.7 查看结果二&#xff0c;detectron2中的faster rcnn检测 2.1 img2.2 myvia.py2.3 运行2.4 结果展示三&#xff0c;via标注 3.1 csv文件修改&am…

ubuntu20.10(Linux)在wine下用pyinstaller打包python程序在window系统运行 交叉编译

1.安装wine 在终端中输入&#xff1a; sudo apt-get install wine2.安装pip 在https://pypi.org/project/pip/#files下载pip-21.0.tar.gz&#xff0c;在压缩包上右键提取到此处&#xff0c;打开解压的文件夹pip-21.0 在该文件夹中打开终端安装pip-21.0.tar.gz&#xff1a; wi…

JVM(六)为什么新生代有两个Survivor分区?

本文会使用排除法的手段&#xff0c;来讲解新生代的区域划分&#xff0c;从而让读者能够更清晰的理解分代回收器的原理&#xff0c;在开始之前我们先来整体认识一下分代收集器。 分代收集器会把内存空间分为&#xff1a;老生代和新生代两个区域&#xff0c;而新生代又会分为&a…

【slowfast复现 训练】训练过程 制作ava数据集 复现 SlowFast Networks for Video Recognition 训练 train

目录 前言一&#xff0c;ava相关文件准备 1.1 空间准备&#xff08;500G&#xff09;1.2 整体ava文件结构1.3 frames文件1.4 frame_lists 文件1.5 annotations 文件二&#xff0c;预训练模型三&#xff0c;配置文件 3.1 创建新的yaml文件3.2 yaml文件解释四&#xff0c;训练前言…