PyQT5+Pycharm编写一个简单的串口上位机

描述

最近开始学习python,还是去年暑假看过一些python语法,至今忘的差不多了,初中的时候学过E语言,当时初中制作些单机外挂之类(CF也做过,呃就是被封号了),最近玩的嵌入式有时候需要用到上位机,之前都是通过E语言做的,总觉得拿不出手,便想着换一个语言写一个上的了台面的

综合考虑,选择的PyQt5来编写上位机(因为python方便些嘛)

话不多说,正文开始:

(1)pycharm的安装

下载连接:http://www.jetbrains.com/pycharm/download/#section=windows

上位机

在这里我选择的是win10版本的pycharm,大家根据系统自行选择,安装过程就不在赘述了。

(2)PyQt5的安装

这个我搜索的时候大家都使用的是pip的方式安装,在这的话我推荐通过Pycharm来安装,比较方便些。

上位机

上位机

上位机

输入pyqt5后选择Install即可

(3)Designer.exe的使用(画界面)

打开designer开始绘制我们的界面:

上位机

绘制完成后由UI文件生成PY文件,此时就可以开始编写代码了

(4)编写程序

新建一个PY文件,我使用的名称为demo.py

先引入需要使用的库

import sys
import serial
import re
import binascii
import _thread
import time
import serial.tools.list_ports
from UI1 import Ui_MainWindow
from PyQt5 import QtWidgets

此时我们开始编写"MAIN"函数,将窗口显示出来,在这里我是选择了一个继承类,来继承通过PYQT5绘制的界面

class PC_software(QtWidgets.QMainWindow,Ui_MainWindow):

    def __init__(self):
        super(PC_software,self).__init__()
        self.setupUi(self)
 
 
if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    myshow = PC_software()
    myshow.show()
    sys.exit(app.exec_())

此时可以正常显示界面,但是没有功能,在PC_software下添加些其它函数

class PC_software(QtWidgets.QMainWindow,Ui_MainWindow):
    def __init__(self):
        super(PC_software,self).__init__()
        self.setupUi(self)
 
        self.ser = serial.Serial()
        self.ser.baudrate = 9600
        self.ser.bytesize = 8  # 设置数据位
        self.ser.stopbits = 1  # 设置停止位
        self.ser.parity = "N"  # 设置校验位
        self.pushButton_4.clicked.connect(self.Clear_text)
        self.pushButton.clicked.connect(self.Screach_COM)
        self.pushButton_2.clicked.connect(self.Clink_COM)
        self.pushButton_3.clicked.connect(self.Data_Send)
        self.Screach_COM()
    def Clear_text(self):
        self.textEdit.clear()
        self.textBrowser.clear()
    def Screach_COM(self):
        self.comboBox.clear()
        port_list = list(serial.tools.list_ports.comports())
        com_numbers = len(port_list)
        p1 = re.compile(r'[(](.*?)[)]', re.S)
        for i in range(com_numbers):
            com_list = str(port_list[i])
            com_name = re.findall(p1, com_list)
            com_name = str(com_name)
            strlist = com_name.split("'")
            self.comboBox.addItem(strlist[1])
    def Clink_COM(self):
        self.ser.port = self.comboBox.currentText()
        if self.ser.is_open == True :
            self.ser.close()
            self.pushButton_2.setText('打开串口')
        else:
            self.ser.open()
            self.pushButton_2.setText('关闭串口')
    def Data_Send(self):
        if self.ser.is_open == True:
            self.ser.write((self.textEdit.toPlainText()+'rn').encode('gbk'))
            #self.ser.write(str(binascii.b2a_hex(self.textEdit.toPlainText()))) #尝试编写HEX发送—失败
    def Data_Recive(self):
 
         while True:
             if self.ser.is_open == True:
                self.RC_data = self.ser.read_all()
                if self.RC_data != b'':
                   #print('receive',self.RC_data.decode("gbk"))
                    self.textBrowser.insertPlainText(self.RC_data.decode("UTF-8"))
                    self.textBrowser.moveCursor(self.textBrowser.textCursor().End)  # 文本框显示到底部

分别实现串口扫描、清空接收、打开/关闭串口、发送数据以及多线程的接收功能。

此时在主函数里面创建线程

_thread.start_new_thread(myshow.Data_Recive,())

此时运行一下程序并验证功能,发现OK

上位机

(5)遇到的问题

首先遇到的问题是无法再另一个文件里面使用其它的槽和对应函数,经过多个群里面的大佬检测后语句没有问题,最后发现是在主函数里面的映射有问题。(更深入了解了python语法的映射关系)

第二个问题是在使用serial库时的发送部分的转码,后来通过encode("GBK")来解决

第三个问题是接受部分,因为打开串口后要时刻准备接收,初始是使用了while True来实现试试监听,后来发现这样程序根本无法运行(无法进入界面),后来通过搜索,以线程的方式实现了互不干扰的实时监听。(python3里thread的库名称更改成了_thread)

编辑:黄飞

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分