簡體   English   中英

用 pyqt5 關閉 window 時如何關閉串口

[英]How to close serial port when closing window with pyqt5

此代碼可以很好地讀取 arduino 的 output 並實時繪制這些值。 但是當我關閉 window 時,串行連接沒有關閉。

import pyqtgraph as pg
from PyQt5 import QtCore, QtWidgets, QtSerialPort
import sys

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        self.graphWidget = pg.PlotWidget()
        self.setCentralWidget(self.graphWidget)

        self.x = list(range(100))  
        self.y = [0 for _ in range(100)] 

        self.graphWidget.setBackground('w')

        pen = pg.mkPen(color=(255, 0, 0))
        self.data_line =  self.graphWidget.plot(self.x, self.y, pen=pen)

        self.serial_port = QtSerialPort.QSerialPort("COM3")
        self.serial_port.setBaudRate(QtSerialPort.QSerialPort.Baud9600)
        self.serial_port.errorOccurred.connect(self.handle_error)
        self.serial_port.readyRead.connect(self.handle_ready_read)
        self.serial_port.open(QtCore.QIODevice.ReadWrite)

    def handle_ready_read(self):
        while self.serial_port.canReadLine():
            codec = QtCore.QTextCodec.codecForName("UTF-8")
            line = codec.toUnicode(self.serial_port.readLine()).strip().strip('\x00')
            try:
                print(line)
                value = float(line)
            except ValueError as e:
                print("error", e)
            else:
                self.update_plot(value)


    def handle_error(self, error):
        if error == QtSerialPort.QSerialPort.NoError:
            return
        print(error, self.serial_port.errorString())

    def update_plot(self, value):
        self.y = self.y[1:] + [value]
        self.x = self.x[1:]  
        self.x.append(self.x[-1] + 1)  
        self.data_line.setData(self.x, self.y) 

app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()

app.exec_()
    

當 window 關閉時,如何確保串口關閉? 也許在 window 上關閉它的按鈕會是一個更好的主意。

如果我將serial_port = QtSerialPort.QSerialPort("COM3")放在主 window 之外(然后將self.serial_port = serial_port放在主 window init 中),那么我可以將serial_port.close()放在文件末尾。 但我不知道如果串行端口連接未在主 window 中初始化,這是否會導致嘗試某些事情時出現問題。

如果您想在 window 關閉時終止連接,請在 closeEvent 方法中執行此操作:

class MainWindow(QtWidgets.QMainWindow):
    # ...
    def closeEvent(self, event):
        super(MainWindow, self).closeEvent(event)
        self.serial_port.close()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM