GUI падает после сбоя подключения к последовательному порту - PullRequest
0 голосов
/ 16 февраля 2020

Я пытаюсь написать код, где я подключаю устройство через последовательный порт. Связь с последовательным портом осуществляется потоком. Если порт не занят - все в порядке и работает по плану, но если порт занят или по какой-то причине не удалось подключиться - я хочу, чтобы мой GUI распечатал ошибку. Он выводит ошибку, но затем застревает и вылетает. Как я могу это исправить? Кроме того, в моем GUI есть меню, и я хочу, чтобы оно сортировалось по номеру 'COM', как я могу это сделать?

Ниже приведен мой код:

GUI part:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(500, 150)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.connectBtn = QtWidgets.QPushButton(self.centralwidget)
        self.connectBtn.setGeometry(QtCore.QRect(85, 50, 75, 23))
        self.connectBtn.setObjectName("connectBtn")
        self.portList = QtWidgets.QPushButton(self.centralwidget)
        self.portList.setGeometry(QtCore.QRect(10, 50, 65, 23))
        self.portList.setObjectName("portList")
        self.productMenu=QtWidgets.QMenu(self.centralwidget)
        self.portList.setMenu(self.productMenu) 


        MainWindow.setCentralWidget(self.centralwidget)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)





    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "GUI"))
        self.portList.setText(_translate("MainWindow", "Ports"))
        self.connectBtn.setText(_translate("MainWindow", "Connect"))

Управляемая часть с моими функциями и потоком:

from PyQt5 import QtWidgets, QtCore, QtGui
from test1 import Ui_MainWindow
import serial.tools.list_ports
from test2 import DEVICE
import sys,traceback
import time
try:
    import queue
except ImportError:
    import Queue as queue

class deviceWorker(QtCore.QRunnable):
    def __init__(self,port,q):
        super(deviceWorker, self).__init__()
        self.finished = QtCore.pyqtSignal() 
        self.port=port
        self.Q=q

    def run(self):
        try:
            self.ecc=DEVICE(self.port)
        except:
            print("ERROR")
        else:
            self.Q.put(self.ecc.version())
class ApplicationWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(ApplicationWindow, self).__init__()

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.threadpool=QtCore.QThreadPool()        
        self.Q=queue.Queue()

        self.ui.productMenu.aboutToShow.connect(self.findPort)
        self.ui.connectBtn.clicked.connect(self.cntClk)
def findPort(self):
           self.ui.productMenu.clear()
           comPorts = list(serial.tools.list_ports.comports()) 
           for port in comPorts:
               self.ui.productMenu.addAction(str(port),self.selectedPort)

    def selectedPort(self):
        self.portNum=self.sender()
        self.portNum=self.portNum.text()
        self.ui.portList.setText(self.portNum[:4])
        self.portNum=self.portNum[3]
        ####How to sort this menu?###             

    def cntClk(self):
        self.worker=deviceWorker(self.portNum,self.Q)
        self.threadpool.start(self.worker)
        ver=self.worker.Q.get()
        if(ver[:3]=="VER"):
            print(ver)
        else:
            print("Error!")

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    application = ApplicationWindow()
    application.show()
    sys.exit(app.exec_())

И, наконец, часть с классом 'DEVICE', которая отвечает за отправку устройство команды: import serial

class DEVICE():
    def __init__(self,Port ):
        self.ser = serial.Serial(port ='COM'+str(Port), baudrate= 38400,timeout=1)

    def cmd(self,command):
        return ('00'+command+chr(13)).encode('utf-8')        
            def version(self):
        self.ser.write(self.cmd('VER'))
        ver=self.ser.readline()
        ver=(ver.decode('utf-8'))
        ver=ver[:9]
        return(ver)

Я хотел бы знать, если кто-нибудь знает, как решить эту проблему, и, как уже было сказано, также разобраться в моем списке портов.

...