工作中串口通讯用的比较多,打算拿串口通讯来作为入门练手的项目,这个是GITHUB上的例程 ,大家可以自己下载,网址:
https://github.com/ColinFred/Pyserial-Demo。
效果图:

实现步骤:
1、安装串口模块
使用PIP安装串口模块,命令行输入 Pip 3.6 installl pyserial 即可

2.pserial_demo.cpp

import sys
import serial
import serial.tools.list_ports
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QMessageBox
from PyQt5.QtCore import QTimer
from ui_demo_1 import Ui_Formclass Pyqt5_Serial(QtWidgets.QWidget, Ui_Form):def __init__(self):super(Pyqt5_Serial, self).__init__()self.setupUi(self)self.init()self.setWindowTitle("串口小助手")self.ser = serial.Serial()self.port_check()# 接收数据和发送数据数目置零self.data_num_received = 0self.lineEdit.setText(str(self.data_num_received))self.data_num_sended = 0self.lineEdit_2.setText(str(self.data_num_sended))def init(self):# 串口检测按钮self.s1__box_1.clicked.connect(self.port_check)# 串口信息显示self.s1__box_2.currentTextChanged.connect(self.port_imf)# 打开串口按钮self.open_button.clicked.connect(self.port_open)# 关闭串口按钮self.close_button.clicked.connect(self.port_close)# 发送数据按钮self.s3__send_button.clicked.connect(self.data_send)# 定时发送数据self.timer_send = QTimer()self.timer_send.timeout.connect(self.data_send)self.timer_send_cb.stateChanged.connect(self.data_send_timer)# 定时器接收数据self.timer = QTimer(self)self.timer.timeout.connect(self.data_receive)# 清除发送窗口self.s3__clear_button.clicked.connect(self.send_data_clear)# 清除接收窗口self.s2__clear_button.clicked.connect(self.receive_data_clear)# 串口检测def port_check(self):# 检测所有存在的串口,将信息存储在字典中self.Com_Dict = {}port_list = list(serial.tools.list_ports.comports())self.s1__box_2.clear()for port in port_list:self.Com_Dict["%s" % port[0]] = "%s" % port[1]self.s1__box_2.addItem(port[0])if len(self.Com_Dict) == 0:self.state_label.setText(" 无串口")# 串口信息def port_imf(self):# 显示选定的串口的详细信息imf_s = self.s1__box_2.currentText()if imf_s != "":self.state_label.setText(self.Com_Dict[self.s1__box_2.currentText()])# 打开串口def port_open(self):self.ser.port = self.s1__box_2.currentText()self.ser.baudrate = int(self.s1__box_3.currentText())self.ser.bytesize = int(self.s1__box_4.currentText())self.ser.stopbits = int(self.s1__box_6.currentText())self.ser.parity = self.s1__box_5.currentText()try:self.ser.open()except:QMessageBox.critical(self, "Port Error", "此串口不能被打开!")return None# 打开串口接收定时器,周期为2msself.timer.start(2)if self.ser.isOpen():self.open_button.setEnabled(False)self.close_button.setEnabled(True)self.formGroupBox1.setTitle("串口状态(已开启)")# 关闭串口def port_close(self):self.timer.stop()self.timer_send.stop()try:self.ser.close()except:passself.open_button.setEnabled(True)self.close_button.setEnabled(False)self.lineEdit_3.setEnabled(True)# 接收数据和发送数据数目置零self.data_num_received = 0self.lineEdit.setText(str(self.data_num_received))self.data_num_sended = 0self.lineEdit_2.setText(str(self.data_num_sended))self.formGroupBox1.setTitle("串口状态(已关闭)")# 发送数据def data_send(self):if self.ser.isOpen():input_s = self.s3__send_text.toPlainText()if input_s != "":# 非空字符串if self.hex_send.isChecked():# hex发送input_s = input_s.strip()send_list = []while input_s != '':try:num = int(input_s[0:2], 16)except ValueError:QMessageBox.critical(self, 'wrong data', '请输入十六进制数据,以空格分开!')return Noneinput_s = input_s[2:].strip()send_list.append(num)input_s = bytes(send_list)else:# ascii发送input_s = (input_s + '\r\n').encode('utf-8')num = self.ser.write(input_s)self.data_num_sended += numself.lineEdit_2.setText(str(self.data_num_sended))else:pass# 接收数据def data_receive(self):try:num = self.ser.inWaiting()except:self.port_close()return Noneif num > 0:data = self.ser.read(num)num = len(data)# hex显示if self.hex_receive.checkState():out_s = ''for i in range(0, len(data)):out_s = out_s + '{:02X}'.format(data[i]) + ' 'self.s2__receive_text.insertPlainText(out_s)else:# 串口接收到的字符串为b'123',要转化成unicode字符串才能输出到窗口中去self.s2__receive_text.insertPlainText(data.decode('iso-8859-1'))# 统计接收字符的数量self.data_num_received += numself.lineEdit.setText(str(self.data_num_received))# 获取到text光标textCursor = self.s2__receive_text.textCursor()# 滚动到底部textCursor.movePosition(textCursor.End)# 设置光标到text中去self.s2__receive_text.setTextCursor(textCursor)else:pass# 定时发送数据def data_send_timer(self):if self.timer_send_cb.isChecked():self.timer_send.start(int(self.lineEdit_3.text()))self.lineEdit_3.setEnabled(False)else:self.timer_send.stop()self.lineEdit_3.setEnabled(True)# 清除显示def send_data_clear(self):self.s3__send_text.setText("")def receive_data_clear(self):self.s2__receive_text.setText("")if __name__ == '__main__':app = QtWidgets.QApplication(sys.argv)myshow = Pyqt5_Serial()myshow.show()sys.exit(app.exec_())

ui_demo_1.py

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'demo_1.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_Form(object):def setupUi(self, Form):Form.setObjectName("Form")Form.resize(707, 458)self.formGroupBox = QtWidgets.QGroupBox(Form)self.formGroupBox.setGeometry(QtCore.QRect(20, 20, 167, 301))self.formGroupBox.setObjectName("formGroupBox")self.formLayout = QtWidgets.QFormLayout(self.formGroupBox)self.formLayout.setContentsMargins(10, 10, 10, 10)self.formLayout.setSpacing(10)self.formLayout.setObjectName("formLayout")self.s1__lb_1 = QtWidgets.QLabel(self.formGroupBox)self.s1__lb_1.setObjectName("s1__lb_1")self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.s1__lb_1)self.s1__box_1 = QtWidgets.QPushButton(self.formGroupBox)self.s1__box_1.setAutoRepeatInterval(100)self.s1__box_1.setDefault(True)self.s1__box_1.setObjectName("s1__box_1")self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.s1__box_1)self.s1__lb_2 = QtWidgets.QLabel(self.formGroupBox)self.s1__lb_2.setObjectName("s1__lb_2")self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.s1__lb_2)self.s1__box_2 = QtWidgets.QComboBox(self.formGroupBox)self.s1__box_2.setObjectName("s1__box_2")self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.s1__box_2)self.s1__lb_3 = QtWidgets.QLabel(self.formGroupBox)self.s1__lb_3.setObjectName("s1__lb_3")self.formLayout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.s1__lb_3)self.s1__box_3 = QtWidgets.QComboBox(self.formGroupBox)self.s1__box_3.setObjectName("s1__box_3")self.s1__box_3.addItem("")self.s1__box_3.addItem("")self.s1__box_3.addItem("")self.s1__box_3.addItem("")self.s1__box_3.addItem("")self.s1__box_3.addItem("")self.s1__box_3.addItem("")self.s1__box_3.addItem("")self.s1__box_3.addItem("")self.s1__box_3.addItem("")self.s1__box_3.addItem("")self.s1__box_3.addItem("")self.formLayout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.s1__box_3)self.s1__lb_4 = QtWidgets.QLabel(self.formGroupBox)self.s1__lb_4.setObjectName("s1__lb_4")self.formLayout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.s1__lb_4)self.s1__box_4 = QtWidgets.QComboBox(self.formGroupBox)self.s1__box_4.setObjectName("s1__box_4")self.s1__box_4.addItem("")self.s1__box_4.addItem("")self.s1__box_4.addItem("")self.s1__box_4.addItem("")self.formLayout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.s1__box_4)self.s1__lb_5 = QtWidgets.QLabel(self.formGroupBox)self.s1__lb_5.setObjectName("s1__lb_5")self.formLayout.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.s1__lb_5)self.s1__box_5 = QtWidgets.QComboBox(self.formGroupBox)self.s1__box_5.setObjectName("s1__box_5")self.s1__box_5.addItem("")self.formLayout.setWidget(5, QtWidgets.QFormLayout.FieldRole, self.s1__box_5)self.open_button = QtWidgets.QPushButton(self.formGroupBox)self.open_button.setObjectName("open_button")self.formLayout.setWidget(7, QtWidgets.QFormLayout.SpanningRole, self.open_button)self.close_button = QtWidgets.QPushButton(self.formGroupBox)self.close_button.setObjectName("close_button")self.formLayout.setWidget(8, QtWidgets.QFormLayout.SpanningRole, self.close_button)self.s1__lb_6 = QtWidgets.QLabel(self.formGroupBox)self.s1__lb_6.setObjectName("s1__lb_6")self.formLayout.setWidget(6, QtWidgets.QFormLayout.LabelRole, self.s1__lb_6)self.s1__box_6 = QtWidgets.QComboBox(self.formGroupBox)self.s1__box_6.setObjectName("s1__box_6")self.s1__box_6.addItem("")self.formLayout.setWidget(6, QtWidgets.QFormLayout.FieldRole, self.s1__box_6)self.state_label = QtWidgets.QLabel(self.formGroupBox)self.state_label.setText("")self.state_label.setTextFormat(QtCore.Qt.AutoText)self.state_label.setScaledContents(True)self.state_label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)self.state_label.setObjectName("state_label")self.formLayout.setWidget(2, QtWidgets.QFormLayout.SpanningRole, self.state_label)self.verticalGroupBox = QtWidgets.QGroupBox(Form)self.verticalGroupBox.setGeometry(QtCore.QRect(210, 20, 401, 241))self.verticalGroupBox.setObjectName("verticalGroupBox")self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalGroupBox)self.verticalLayout.setContentsMargins(10, 10, 10, 10)self.verticalLayout.setObjectName("verticalLayout")self.s2__receive_text = QtWidgets.QTextBrowser(self.verticalGroupBox)self.s2__receive_text.setObjectName("s2__receive_text")self.verticalLayout.addWidget(self.s2__receive_text)self.verticalGroupBox_2 = QtWidgets.QGroupBox(Form)self.verticalGroupBox_2.setGeometry(QtCore.QRect(210, 280, 401, 101))self.verticalGroupBox_2.setObjectName("verticalGroupBox_2")self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.verticalGroupBox_2)self.verticalLayout_2.setContentsMargins(10, 10, 10, 10)self.verticalLayout_2.setObjectName("verticalLayout_2")self.s3__send_text = QtWidgets.QTextEdit(self.verticalGroupBox_2)self.s3__send_text.setObjectName("s3__send_text")self.verticalLayout_2.addWidget(self.s3__send_text)self.s3__send_button = QtWidgets.QPushButton(Form)self.s3__send_button.setGeometry(QtCore.QRect(620, 310, 61, 31))self.s3__send_button.setObjectName("s3__send_button")self.s3__clear_button = QtWidgets.QPushButton(Form)self.s3__clear_button.setGeometry(QtCore.QRect(620, 350, 61, 31))self.s3__clear_button.setObjectName("s3__clear_button")self.formGroupBox1 = QtWidgets.QGroupBox(Form)self.formGroupBox1.setGeometry(QtCore.QRect(20, 340, 171, 101))self.formGroupBox1.setObjectName("formGroupBox1")self.formLayout_2 = QtWidgets.QFormLayout(self.formGroupBox1)self.formLayout_2.setContentsMargins(10, 10, 10, 10)self.formLayout_2.setSpacing(10)self.formLayout_2.setObjectName("formLayout_2")self.label = QtWidgets.QLabel(self.formGroupBox1)self.label.setObjectName("label")self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label)self.label_2 = QtWidgets.QLabel(self.formGroupBox1)self.label_2.setObjectName("label_2")self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_2)self.lineEdit = QtWidgets.QLineEdit(self.formGroupBox1)self.lineEdit.setObjectName("lineEdit")self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.lineEdit)self.lineEdit_2 = QtWidgets.QLineEdit(self.formGroupBox1)self.lineEdit_2.setObjectName("lineEdit_2")self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.lineEdit_2)self.hex_send = QtWidgets.QCheckBox(Form)self.hex_send.setGeometry(QtCore.QRect(620, 280, 71, 16))self.hex_send.setObjectName("hex_send")self.hex_receive = QtWidgets.QCheckBox(Form)self.hex_receive.setGeometry(QtCore.QRect(620, 40, 71, 16))self.hex_receive.setObjectName("hex_receive")self.s2__clear_button = QtWidgets.QPushButton(Form)self.s2__clear_button.setGeometry(QtCore.QRect(620, 80, 61, 31))self.s2__clear_button.setObjectName("s2__clear_button")self.timer_send_cb = QtWidgets.QCheckBox(Form)self.timer_send_cb.setGeometry(QtCore.QRect(260, 390, 71, 16))self.timer_send_cb.setObjectName("timer_send_cb")self.lineEdit_3 = QtWidgets.QLineEdit(Form)self.lineEdit_3.setGeometry(QtCore.QRect(350, 390, 61, 20))self.lineEdit_3.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)self.lineEdit_3.setObjectName("lineEdit_3")self.dw = QtWidgets.QLabel(Form)self.dw.setGeometry(QtCore.QRect(420, 390, 54, 20))self.dw.setObjectName("dw")self.verticalGroupBox.raise_()self.verticalGroupBox_2.raise_()self.formGroupBox.raise_()self.s3__send_button.raise_()self.s3__clear_button.raise_()self.formGroupBox.raise_()self.hex_send.raise_()self.hex_receive.raise_()self.s2__clear_button.raise_()self.timer_send_cb.raise_()self.lineEdit_3.raise_()self.dw.raise_()self.retranslateUi(Form)QtCore.QMetaObject.connectSlotsByName(Form)def retranslateUi(self, Form):_translate = QtCore.QCoreApplication.translateForm.setWindowTitle(_translate("Form", "Form"))self.formGroupBox.setTitle(_translate("Form", "串口设置"))self.s1__lb_1.setText(_translate("Form", "串口检测:"))self.s1__box_1.setText(_translate("Form", "检测串口"))self.s1__lb_2.setText(_translate("Form", "串口选择:"))self.s1__lb_3.setText(_translate("Form", "波特率:"))self.s1__box_3.setItemText(0, _translate("Form", "256000"))self.s1__box_3.setItemText(1, _translate("Form", "2400"))self.s1__box_3.setItemText(2, _translate("Form", "4800"))self.s1__box_3.setItemText(3, _translate("Form", "9600"))self.s1__box_3.setItemText(4, _translate("Form", "14400"))self.s1__box_3.setItemText(5, _translate("Form", "19200"))self.s1__box_3.setItemText(6, _translate("Form", "38400"))self.s1__box_3.setItemText(7, _translate("Form", "57600"))self.s1__box_3.setItemText(8, _translate("Form", "76800"))self.s1__box_3.setItemText(9, _translate("Form", "12800"))self.s1__box_3.setItemText(10, _translate("Form", "230400"))self.s1__box_3.setItemText(11, _translate("Form", "460800"))self.s1__lb_4.setText(_translate("Form", "数据位:"))self.s1__box_4.setItemText(0, _translate("Form", "8"))self.s1__box_4.setItemText(1, _translate("Form", "7"))self.s1__box_4.setItemText(2, _translate("Form", "6"))self.s1__box_4.setItemText(3, _translate("Form", "5"))self.s1__lb_5.setText(_translate("Form", "校验位:"))self.s1__box_5.setItemText(0, _translate("Form", "N"))self.open_button.setText(_translate("Form", "打开串口"))self.close_button.setText(_translate("Form", "关闭串口"))self.s1__lb_6.setText(_translate("Form", "停止位:"))self.s1__box_6.setItemText(0, _translate("Form", "1"))self.verticalGroupBox.setTitle(_translate("Form", "接受区"))self.verticalGroupBox_2.setTitle(_translate("Form", "发送区"))self.s3__send_text.setHtml(_translate("Form", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'SimSun\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">123456</p></body></html>"))self.s3__send_button.setText(_translate("Form", "发送"))self.s3__clear_button.setText(_translate("Form", "清除"))self.formGroupBox1.setTitle(_translate("Form", "串口状态"))self.label.setText(_translate("Form", "已接收:"))self.label_2.setText(_translate("Form", "已发送:"))self.hex_send.setText(_translate("Form", "Hex发送"))self.hex_receive.setText(_translate("Form", "Hex接收"))self.s2__clear_button.setText(_translate("Form", "清除"))self.timer_send_cb.setText(_translate("Form", "定时发送"))self.lineEdit_3.setText(_translate("Form", "1000"))self.dw.setText(_translate("Form", "ms/次"))

虽然还很多地方不是很明白,但是跑了一下看到效果觉得用pyqt实现真的比用MFC省事太多太多了!

Python3.6+PyQT5+Pyserial 实现简单串口助手相关推荐

  1. 友善串口工具接收数据随机换行_使用Python3+PyQT5+Pyserial 实现简单的串口工具方法...

    练手项目,先上图 先实现一个简单的串口工具,为之后的上位机做准备 代码如下: pyserial_demo.py import sys import serial import serial.tools ...

  2. C# winform 制作串口助手(仅需一小时手把手学会制作简单串口助手)

    下载链接 (个人学习总结记录,欢迎+v:a923510073讨论). 使用winform制作简单的串口工具,实现串口数据收发. 大致思路如下: 编写完成后,界面如下: 连接成功显示: 三个按钮名字 为 ...

  3. Python PyQt5 PySerial 书签备份 2018/12/6

    Bookmarks 书签栏 PyQt5 事件和信号 · PyQt5 中文教程 艾伦智能/pyqt5 pyserial-github pySerial API - pySerial 3.0 docume ...

  4. openmv串口数据 串口助手_第三课使用pyserial来接收和发送串口数据

    1.python的库非常多,功能同样十分强大,在现有的库的情况下,我们没有必要去重复造轮子,拿来用就可以了,在这里我选了pyserial库. 安装pyserial,使用pip工具,在cmd界面输入:p ...

  5. Python 利用PyQt5写一个简易的串口助手

    学习单片机,STM32好长时间了,也做了一些项目,一直想利用上位机实现电脑与单片机之间的传输数据,利用串口助手是最直接的通信方式,但串口助手不适合做上位机,如果会写串口助手的软件,基本能写自己写一个上 ...

  6. 最简单DIY基于ESP32CAM的物联网相机系统④(用调试串口助手实现串口图传)

    第一篇:最简单DIY基于ESP32CAM的物联网相机系统①(用网页实现拍照图传) 第二篇:最简单DIY基于ESP32CAM的物联网相机系统②(在JAVAWEB服务器实现图片查看器) 第三篇:最简单DI ...

  7. Visual Studio 2019 C# 上位机入门(2):写一个简单的串口助手

    前言 本文记录一下用Visual Studio 2019 C# 写一个简单的串口助手的过程,由于没有先从小处学习,而是直接找相关资料就开始做,免不了很多奇怪的问题花了一些时间,基于此情况,我将尽可能整 ...

  8. 简单的串口助手程序开发

    1.简介 之前在烽火集团实习的时候,开发串口通信程序用的都是纯C++.感觉串口程序开发很考验人的逻辑思考能力.不过,现在好了,科研工作中,一切已存在的"利器"都可以用来为自己的&q ...

  9. 从零开始编写一个上位机(串口助手)QT Creator + Python

    提示:本博客作为学习笔记,有错误的地方希望指正,此文可能会比较长,作为学习笔记的积累,希望对来着有帮助.   绪论:笔者这里使用的是QTCreator和Python来实现一个简单的串口上位机的开发的简 ...

最新文章

  1. Swift2.0语言教程之类的嵌套与可选链接
  2. 字符串的长度超过了为 maxJsonLength 属性设置的值
  3. cmd命令将web项目打成jar包_2020全网首发!JDK14之jpackage命令尝鲜
  4. sphinx的CJK分词
  5. Vue2.0 传值方式
  6. [转]让Linux的tty界面支持中文
  7. php快速开发框架津县,BetePHP:一个轻量级快速开发框架
  8. win7下安装 python2 和python3
  9. 【转】DCOM远程调用权限设置
  10. it 部门的建议_应对IT项目阻力的8个建议
  11. xilinx7中管脚mrcc和srcc_Xilinx 7系列FPGA收发器架构之硬件设计指导(一)
  12. windows下boost库的基本使用方法
  13. 【写作技巧】毕业论文题目拟定原则
  14. 具体数学-第7课(取整基础)
  15. 使用NSSM配置守护进程 Nginx(Windows)
  16. MATLAB实现QPSK
  17. php在word中生成表格,word创建表格的三种方法分别是什么
  18. 记一次投稿springer期刊,利用tex排版文稿
  19. 安装使用完虚拟机UltraISO后,删除电脑中多出的“CD驱动器”盘符
  20. 考初级计算机证需要考什么,计算机初级证书要考哪些内容

热门文章

  1. Android微信/QQ红包自动抢(AccessibilityService)
  2. 黑客攻击无孔不入:连电影字幕都能被入侵
  3. jsencrypt.js加密java后端解密
  4. 小米11系列详细参数对比,11青春版/11/11Pro/11Ultra
  5. VNC Viewer 远程 Unable to connect to VNC Server using your chosen securitysetting. 问题解决
  6. JavaScript版科学计算器(收藏品)
  7. 基于Navicat管理工具实现以客户为导向的数据库基本操作
  8. 使用Nginx代理地址
  9. wireshark解析自定义协议
  10. 编程,绘图,设置坐标轴,做出自己的坐标轴