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()+'\r\n').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)

谢谢大家观看!!

### 如何在使用 PyQt5PyCharm 开发串口上位机时将项目导出为可执行文件 #### 虚拟环境设置 为了确保项目的依赖项管理清晰并避免打包过程中出现问题,建议创建一个独立的 Python 虚拟环境。通过虚拟环境可以隔离不同项目的库版本冲突。 ```bash python -m venv my_env source my_env/bin/activate # Linux/MacOS my_env\Scripts\activate # Windows ``` #### 安装必要的库 在虚拟环境中安装所需的库,包括 `PyQt5` 和其他可能需要的工具: ```bash pip install pyqt5 pyserial pyinstaller ``` 如果需要额外的功能支持(如设计界面),还可以安装 `PyQt5-tools`[^1]: ```bash pip install pyqt5-tools ``` #### 使用 PyQt5 设计 GUI 界面 可以通过 Qt Designer 工具来设计图形化界面,并将其保存为 `.ui` 文件。之后利用 `pyuic5` 将其转换为 Python 可读的代码形式: ```bash pyuic5 your_design.ui -o ui_your_design.py ``` 此命令会生成一个名为 `ui_your_design.py` 的模块,可以在主程序中导入该模块以加载 UI 界面。 #### 编写主程序逻辑 编写主程序时需引入上述生成的 UI 模块以及处理串口通信的相关功能。以下是一个简单的示例框架: ```python import sys from PyQt5.QtWidgets import QApplication, QMainWindow from ui_your_design import Ui_MainWindow # 替换为你自己的UI类名 import serial class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.ui = Ui_MainWindow() self.ui.setupUi(self) # 初始化串口对象 self.serial_port = None def open_serial(self): try: port_name = self.ui.portComboBox.currentText() # 假设有一个下拉框用于选择端口号 baud_rate = int(self.ui.baudRateLineEdit.text()) # 获取波特率输入值 self.serial_port = serial.Serial(port=port_name, baudrate=baud_rate) print(f"Serial Port Opened: {port_name}") except Exception as e: print(f"Error opening serial port: {e}") if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) ``` #### 打包成 EXE 文件 完成开发后,可以使用 `PyInstaller` 来将整个应用程序及其依赖项打包为单个可执行文件。以下是具体操作步骤: 1. **进入项目目录** 切换到包含主脚本的目录。 2. **运行 PyInstaller 命令** 下列命令会生成一个单独的 EXE 文件,适用于分发给不熟悉 Python 的用户: ```bash pyinstaller --onefile --noconsole main_script.py ``` 如果希望保留控制台窗口以便调试,则移除 `--noconsole` 参数。 3. **解决潜在问题** 在某些情况下,可能会遇到缺少特定插件的问题,例如无法找到或加载 Qt 平台插件 "windows"[^2]。此时可通过手动指定路径的方式解决问题,在 PyInstaller 中加入如下参数: ```bash pyinstaller --onefile --noconsole --add-data="path_to_qt_plugins;." main_script.py ``` 需要替换 `path_to_qt_plugins` 为实际的 Qt 插件所在位置。 #### 测试生成的 EXE 文件 最后一步是在目标机器上测试生成的 EXE 文件是否能够正常启动和工作。如果有任何异常情况发生,请返回检查配置或者重新调整打包选项。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值