这篇博客主要记录一下PyQT多线程串口的主要代码分析,文末会有工程的源代码文件
首先,从PyCharm启动QtDesigner

之前给客户做的上位机,保密起见,删减了大部分的框图构件,但不影响本篇串口教程
QtDesigner界面如下:

忽略 添加数据以及表格数据显示,这里用不到
着重讲一下类的构成
新建一个串口类SerialThread,继承自QtCore.QThread,实现全部的串口收发功能

class SerialThread(QtCore.QThread):dataReadoutSignal = pyqtSignal(str)def __init__(self, parent = None, portName = 'COM3', baudrate = 9600, parity = 'N', bytesize = 8, stopbits = 1, timeout = None):super(SerialThread, self).__init__(parent)self.m_serialPort = serial.Serial()self.m_serialPort.port = portNameself.m_serialPort.baudrate = baudrateself.m_serialPort.parity = parityself.m_serialPort.bytesize = bytesizeself.m_serialPort.stopbits = stopbitsself.m_serialPort.timeout = timeoutself.OpenScom()def OpenScom(self):try:self.m_serialPort.open()self.m_serialPort.setRTS(True)self.m_serialPort.setDTR(True)except Exception as ex:print(ex)return exdef ScomSendOneData(self,datain):if isinstance(datain,int):listTemp = []listTemp.append(datain)d = bytes(listTemp)self.m_serialPort.write(d)else:if isinstance(datain,str):d = datain.encode('utf-8')self.m_serialPort.write(d)def ScomGetintData(self):n = self.m_serialPort.inWaiting()if n:data = self.m_serialPort.read(n).hex()#writefileprint(data)def ScomGetstrData(self):if self.m_serialPort.is_open:n = self.m_serialPort.inWaiting()if n > 0:data = self.m_serialPort.read(n).decode('GB2312',errors='ignore')return datadef run(self):cnt = 50while cnt <= 3000:sendstr = str(cnt)if len(sendstr) == 2:sendstr = '00' + sendstrelse:if len(sendstr) == 3:sendstr = '0' + sendstrself.ScomSendOneData('SET' + sendstr + 'V')cnt = cnt + 5print('此时设置电压为:' + sendstr + 'V')time.sleep(2)

函数功能见名知意,此处不表。这里主要讲一下run函数,run函数实现了一次循环,50到3000步进取5,发送内容是SET0050V到SET3000V,当然,我这样做是业务需求,如果并不需要这个功能,run函数可以写成

    def run(self):while true:time.sleep(2)

界面我们用QtDesigner制作的ui文件通过pyUIC生成py文件

生成的代码如下(太长,只留前几行)

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'CashUpdateUI11v.ui'
#
# Created by: PyQt5 UI code generator 5.6
#
# WARNING! All changes made in this file will be lost!from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_cash(object):def setupUi(self, cash):******

此时,新建一个类MyWindow,继承QMainWindow和Ui_cash,并在类内部,创建SerialThread成员
总体代码如下:

class MyWindow(QMainWindow,Ui_cash):def __init__(self):super(MyWindow,self).__init__()self.scomList = []self.threadList = []self.setupUi(self)self.actionOpen.triggered.connect(self.openMsg)self.actionSave.triggered.connect(self.saveMsg)self.pushButton.clicked.connect(self.ScomAutoFind)self.addDataButton.clicked.connect(self.getRHandT)self.tableWidget.setColumnCount(5)self.tableWidget.setRowCount(1)self.tableWidget.setHorizontalHeaderLabels(['11', '22', '33', '44', '55'])self.tableRowCnt = 0self.tableColumnCnt = 0self.ThreadComID = 0self.addDatasignal = pyqtSignal(str)self.datadict = {'RHldy':0,'Tldy':0,'meaRT':0,'voltport':0}def getMCUdata(self):if self.ThreadComID == 0:self.showMsgbox('请先连接串口')else:self.ThreadComID.ScomSendOneData(' 5501AA')time.sleep(0.1)strt = self.ThreadComID.ScomGetstrData()if strt is None:self.showMsgbox('请将串口线连接到电路板')return Noneprint(strt)self.datadict['voltport'] = strt[4:-3] + '.' + strt[-3:-2]self.ThreadComID.ScomSendOneData(' 5502AA')time.sleep(0.1)strt = self.ThreadComID.ScomGetstrData()if strt is None:self.showMsgbox('请将串口线连接到电路板')return Noneprint(strt)self.datadict['meaRT'] = strt[4:-4] + '.' + strt[-4:-2]return 1def insertTableNewLine(self):self.tableWidget.setItem(self.tableRowCnt, 0, QTableWidgetItem(self.datadict['RHldy']))self.tableWidget.setItem(self.tableRowCnt, 1, QTableWidgetItem(self.datadict['Tldy']))self.tableWidget.setItem(self.tableRowCnt, 2, QTableWidgetItem(self.datadict['meaRT']))self.tableWidget.setItem(self.tableRowCnt, 3, QTableWidgetItem(self.datadict['voltport']))self.tableWidget.setItem(self.tableRowCnt, 4, QTableWidgetItem(str(datetime.date.today())+' '+str(datetime.datetime.today().hour)+':'+str(datetime.datetime.today().minute)))self.tableRowCnt += 1self.tableWidget.insertRow(self.tableRowCnt)def openMsg(self):file,ok = QFileDialog.getOpenFileName(self,"打开记录表","C:/",".txt")def getRHandT(self):if self.ThreadComID == 0:self.showMsgbox('请先连接串口')else:data,ok = QInputDialog.getText(self, "露点仪数据", "按如下格式记录:\n  RH空格T\n示例:\n  RH(0~100):66.6\n  T(0~200):9.8\n  输入:66.6 9.8", QLineEdit.Normal, "66.6 9.8" )if ok == True:data = re.findall('^[0-9]+\.[0-9]+\s+[0-9]+\.[0-9]+$', data.rstrip())if len(data) == 0:self.showMsgbox('数据格式有误,重新录入')else:data = data[0].split()print(data)self.datadict['RHldy'] = data[0]self.datadict['Tldy'] = data[1]if self.getMCUdata() is None:return Noneprint(self.datadict)self.insertTableNewLine()else:self.showMsgbox('请重新录入数据')def showMsgbox(self,strtoshow):QMessageBox.warning(self,'提示',strtoshow,QMessageBox.Ok)def saveMsg(self):file,ok = QFileDialog.getSaveFileName(self,"保存记录表","C:/",".txt")def ScomAutoFind(self):self.pushButton.setDisabled(True)self.scomList = list(serial.tools.list_ports.comports())if len(self.scomList) <= 0:self.showMsgbox('未发现串口,请检查线缆连接')self.pushButton.setDisabled(False)else:comNum = len(self.scomList)print(str(comNum) + 'Scom is found')while comNum:comNum = comNum - 1if "USB" in str(self.scomList[comNum]):self.ThreadComID = SerialThread(portName=self.scomList[comNum][0])self.ThreadComID.start()self.graphicsView.setStyleSheet("background-color: rgb(0, 255, 0);")print(str(self.scomList[comNum]) + ' is added')

由于我用的是RS232转USB接入电脑,设备名称是USB-SERIAL CH340,当然还有其他RS232转USB芯片,如PL2303等。我这里就单独检查USB是否在设备名称中,没有检查全名,这里要根据实际需求变动

最后就是main了,没什么特别

if __name__ == "__main__":app = QApplication(sys.argv)myshow = MyWindow()myshow.show()print('程序终止')sys.exit(app.exec_())

看一下实际运行效果:
实际运行,(忽略 添加数据 与 数据记录表….)

点击connect后,

当然点击添加数据也是没问题的哈

奉上全部工程文件,连接如下:
https://download.csdn.net/download/ysgjiangsu/10324162

时间原因写的比较粗糙,各位多包涵,以后业务多偏向C++QT,后续会多出相关文章

PyQT多线程串口 QtDesigner相关推荐

  1. CSerialPort多线程串口编程工具详解

    1.前言 既然有了MSComm这种简单粗暴的控件,为什么还需要CSerialPort类?这是因为与前者相比,这个类在程序的发布上不需要加入其他的文件,而且CSerialPort提供给我们的函数都是开放 ...

  2. Qt下实现多线程串口通信

    Qt下实现多线程串口通信 Qt下无论是RS232.RS422.RS485的串口通信都可以使用统一的编码实现.本文把每路串口的通信各放在一个线程中,使用movetoThread的方式实现. 用Seria ...

  3. Qt练习:多线程串口通信

    最近在学习Qt编程,为了练手,想做一个串口通信的小软件为之后的项目做准备,经过几天的学习与练习初步搭建起了多线程串口通信的框架及较少的其他功能 功能简介 串口接收 主线程显示ui,子线程接收串口数据, ...

  4. 【实例记录】在ubuntu上运行python实现与单片机多线程串口通信

    文章目录 工具 步骤 工具 工具:自己电脑双系统的ubuntu18.04,单片机esp8266,一个usb转ttl模块,ubuntu上已经下载了python的3.6和pip,还需要pip instal ...

  5. linux 多线程串口编程总结

    最近在玩DJI M100,调用API获取GPS位置时发现高程定位完全是错的(负的几百多米),查了一下文档说高程数据是由气压计得到的,而飞行控制时又需要比较可靠的高度信息,于是乎决定用上我们实验室的搭载 ...

  6. Qt 多线程串口编程

    一.问题 以前串口编程使用第三方的CnComm.h编程,CnComm作者博客链接,使用起来还蛮好的,不过既然用qt了就想着用qt自带的QSerialPort,移植性更好一些,结果折腾了好几天,主要遇到 ...

  7. Cannot make QOpenGLContext current in a different thread : PyQt多线程崩溃的解决方法

    我在网上看了好多大佬的文章,很多看不懂而且无效@_@,而且我不太懂c++相关的此类方案(羞愧). 先描述一下我的问题 源: 下面是我的解决方案 : 由于我用的是threading多线程模块报错,我就想 ...

  8. QT 多线程串口通讯 串口助手

    前言 模仿XCom写的一个串口助手 没模仿完全 因为帮助页是我不需要的 其次就是协议通讯我也不太懂 所以这2个界面也没有弄 1.讲一些个人认为比较麻烦的实现功能 其实如果用QT比较多应该都明白 那么多 ...

  9. 【转】Qt 多线程串口通信问题?

    问题描述: 来自:https://www.zhihu.com/question/31518679 现在我的项目关于线程和串口通信这里出了很多问题.思路现在就是我首先自己封装了QSerialport的o ...

  10. pyqt 多线程使用

    注意:使用时thread1 = WorkThread() 开多个线程时,变量名不能重复,则否会释放前一个(因为每个线程需要一直运行)线程. class WorkThread(QThread):trig ...

最新文章

  1. WIN2003 下安装 WinWebMail 3.6.3.1
  2. 压测导致mysql数据库CPU很高_排查压测问题引发的系统性能调优过程
  3. java读取gxk文件,Java中常见的IO流及其使用
  4. windows系统bat批处理 打开乱码
  5. System.Diagnostics.debug.Assert(条件)的使用
  6. 2020 【第十一届蓝桥杯省赛】 C/C++ B组 (第二场)
  7. 安徽省计算机一级PDF,安徽省计算机一级考试试题 .pdf
  8. 苹果iOS设备解锁软件:iToolab UnlockGo
  9. java smali代码 解读_Smali代码语法
  10. 蛋白质性质和结构分析
  11. 计算机辅助工程试卷,《计算机辅助工程软件(UG)》试卷10–2答.doc
  12. 苹果关闭iOS 16.1.2 验证通道,iPhone升级 iOS 16.2 后无法降级
  13. Go: 模拟一张银行卡存、取、查的功能(综合练习)
  14. 【嵌入式开发】监测系统——用QT编写下位机
  15. 《策略投资》第1、2章读书分享
  16. 关于上传资源的最新公告
  17. ZooKeeper【基础知识 02】zookeeper-3.6.0 常用Shell命令(节点增删改查+监听器+四字指令)
  18. WPF编程;上位机编程;C#编程;仿QQ基础实现(一)之界面预览
  19. 10 ORM 多表操作 查询
  20. Python文件,照片批量重命名脚本

热门文章

  1. JAVA中文件下载和文件批量下载方法
  2. React-native设置全局函数globle【适用于有组件嵌套时】
  3. Qt多线程之QThread
  4. selenium 网址
  5. CDA数据分析师教材与题库
  6. 直角三角形用计算机怎么做,‎App Store 上的“直角三角形计算器”
  7. 【Linux】ROS机器人操作系统的安装与使用
  8. CSS4.2.3 参考手册.CHM
  9. YOLO系列目标检测算法-YOLOv2
  10. linux i350网卡,intel I350 网卡驱动安装方法