提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
`
一个简单的串口程序-上位机, 基于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网络请求的数据。
总结
代码简单,适合初学者参考学习