基于Python的一个串口程序 上位机 DEMO

本文介绍了一个基于Python和PyQt5的简单串口程序,它能自动检测连接的端口,配置波特率等参数,并实现数据的收发。适合初学者学习串口通信编程。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

`
一个简单的串口程序-上位机, 基于Python, pyqt5 代码实现.
需要安装sys, pyqt5.


`

一、程序基本功能

这个程序可以自动搜索电脑上已经连接的端口, 自由设置端口, 码率, 开关串口.
接收数据, 发送数据.

二、全部代码, 代码直接复制可用

1.全部代码

代码如下(示例):

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton, QTextEdit, QComboBox
from PyQt5.QtSerialPort import QSerialPort, QSerialPortInfo

class SerialTerminal(QMainWindow):
    def __init__(self):
        super().__init__()

        self.serial_port = QSerialPort()
        self.init_ui()

    def init_ui(self):
        self.setWindowTitle("Serial TerminalXXX")
        self.setGeometry(100, 100, 800, 600)

        central_widget = QWidget()
        self.setCentralWidget(central_widget)

        # Layout
        main_layout = QVBoxLayout()
        central_widget.setLayout(main_layout)

        # Serial Port Settings
        serial_settings_layout = QHBoxLayout()
        main_layout.addLayout(serial_settings_layout)

        port_label = QLabel("Port:")
        self.port_combobox = QComboBox()
        serial_settings_layout.addWidget(port_label)
        serial_settings_layout.addWidget(self.port_combobox)

        baudrate_label = QLabel("Baudrate:")
        self.baudrate_combobox = QComboBox()
        self.baudrate_combobox.addItems(["9600", "19200", "38400", "115200"])
        serial_settings_layout.addWidget(baudrate_label)
        serial_settings_layout.addWidget(self.baudrate_combobox)

        stopbits_label = QLabel("Stop Bits:")
        self.stopbits_combobox = QComboBox()
        self.stopbits_combobox.addItems(["1", "1.5", "2"])
        serial_settings_layout.addWidget(stopbits_label)
        serial_settings_layout.addWidget(self.stopbits_combobox)

        parity_label = QLabel("Parity:")
        self.parity_combobox = QComboBox()
        self.parity_combobox.addItems(["None", "Even", "Odd"])
        serial_settings_layout.addWidget(parity_label)
        serial_settings_layout.addWidget(self.parity_combobox)

        flowcontrol_label = QLabel("Flow Control:")
        self.flowcontrol_combobox = QComboBox()
        self.flowcontrol_combobox.addItems(["None", "RTS/CTS", "XON/XOFF"])
        serial_settings_layout.addWidget(flowcontrol_label)
        serial_settings_layout.addWidget(self.flowcontrol_combobox)

        # Open/Close Port Button
        self.open_close_button = QPushButton("Open Port")
        self.open_close_button.clicked.connect(self.toggle_serial_port)
        main_layout.addWidget(self.open_close_button)

        # Received Data Display
        self.received_data_label = QLabel("Received Data:")
        main_layout.addWidget(self.received_data_label)

        self.received_data_textedit = QTextEdit()
        self.received_data_textedit.setReadOnly(True)
        main_layout.addWidget(self.received_data_textedit)

        # Send Data
        self.send_data_label = QLabel("Send Data:")
        main_layout.addWidget(self.send_data_label)

        self.send_data_textedit = QTextEdit()
        main_layout.addWidget(self.send_data_textedit)

        send_data_button = QPushButton("Send")
        send_data_button.clicked.connect(self.send_data)
        main_layout.addWidget(send_data_button)

        # Populate Serial Ports
        self.populate_serial_ports()

    def populate_serial_ports(self):
        serial_ports = QSerialPortInfo.availablePorts()
        for port in serial_ports:
            self.port_combobox.addItem(port.portName())

    def toggle_serial_port(self):
        if self.serial_port.isOpen():
            self.serial_port.close()
            self.open_close_button.setText("Open Port")
        else:
            port_name = self.port_combobox.currentText()
            self.serial_port.setPortName(port_name)

            baudrate = int(self.baudrate_combobox.currentText())
            self.serial_port.setBaudRate(baudrate)

            stopbits = float(self.stopbits_combobox.currentText())
            if stopbits == 1:
                self.serial_port.setStopBits(QSerialPort.OneStop)
            elif stopbits == 1.5:
                self.serial_port.setStopBits(QSerialPort.OneAndHalfStop)
            elif stopbits == 2:
                self.serial_port.setStopBits(QSerialPort.TwoStop)

            parity = self.parity_combobox.currentText()
            if parity == "None":
                self.serial_port.setParity(QSerialPort.NoParity)
            elif parity == "Even":
                self.serial_port.setParity(QSerialPort.EvenParity)
            elif parity == "Odd":
                self.serial_port.setParity(QSerialPort.OddParity)

            flowcontrol = self.flowcontrol_combobox.currentText()
            if flowcontrol == "None":
                self.serial_port.setFlowControl(QSerialPort.NoFlowControl)
            elif flowcontrol == "RTS/CTS":
                self.serial_port.setFlowControl(QSerialPort.RtsCtsFlowControl)
            elif flowcontrol == "XON/XOFF":
                self.serial_port.setFlowControl(QSerialPort.SoftwareControl)

            if self.serial_port.open(QSerialPort.ReadWrite):
                self.serial_port.readyRead.connect(self.receive_data)
                self.open_close_button.setText("Close Port")
            else:
                print("Failed to open port")

    def receive_data(self):
        while self.serial_port.canReadLine():
            data = self.serial_port.readLine().data().decode()
            self.received_data_textedit.append(data)

    def send_data(self):
        data = self.send_data_textedit.toPlainText()
        self.serial_port.write(data.encode())

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = SerialTerminal()
    window.show()
    sys.exit(app.exec_())

在这里插入图片描述

该处使用的url网络请求的数据。


总结

代码简单,适合初学者参考学习

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值