Heim  >  Artikel  >  Backend-Entwicklung  >  Python PyQT-Multithread-Codeanalyse für serielle Ports

Python PyQT-Multithread-Codeanalyse für serielle Ports

零到壹度
零到壹度Original
2018-04-03 14:22:146203Durchsuche

In diesem Artikel wird hauptsächlich die Analyse des PyQT-Multithread-Seriell-Port-Codes in Python vorgestellt. Der Herausgeber findet ihn recht gut, daher werde ich ihn jetzt mit Ihnen teilen und als Referenz verwenden. Kommen Sie und werfen Sie einen Blick mit dem Editor

Dieser Blog zeichnet hauptsächlich die Hauptcodeanalyse der PyQT-Multithread-Seriellschnittstelle auf. Am Ende des Artikels finden Sie Quellcodedateien des Projekts
Zuerst , starten Sie QtDesigner von PyCharm


Python PyQT-Multithread-Codeanalyse für serielle Ports
Aus Gründen der Vertraulichkeit wurden die meisten Blockdiagrammkomponenten für den Hostcomputer gelöscht, den ich zuvor für einen Kunden erstellt habe, dies ist jedoch nicht der Fall wirkt sich auf dieses Tutorial zur seriellen Schnittstelle aus
Die QtDesigner-Schnittstelle sieht wie folgt aus:


Python PyQT-Multithread-Codeanalyse für serielle Ports
Das Hinzufügen von Daten und die tabellarische Datenanzeige ignorieren, die hier nicht benötigt werden
Konzentrieren Sie sich auf die Komposition der Klasse
Erstellen Sie eine neue serielle Port-Klasse SerialThread, geerbt von QtCore.QThread, um alle seriellen Ports zu implementieren. Die Funktionen der Sende- und Empfangsfunktionen

class SerialThread(QtCore.QThread):
    dataReadoutSignal = pyqtSignal(str)    def __init__(self, parent = None, portName = 'COM3', baudrate = 9600, parity = 'N', bytesize = 8, stopbits = 1, timeout = None):
        super(SerialThread, self).__init__(parent)
        self.m_serialPort = serial.Serial()
        self.m_serialPort.port = portName
        self.m_serialPort.baudrate = baudrate
        self.m_serialPort.parity = parity
        self.m_serialPort.bytesize = bytesize
        self.m_serialPort.stopbits = stopbits
        self.m_serialPort.timeout = timeout
        self.OpenScom()    def OpenScom(self):
        try:
            self.m_serialPort.open()
            self.m_serialPort.setRTS(True)
            self.m_serialPort.setDTR(True)        except Exception as ex:
            print(ex)            return ex    def ScomSendOneData(self,datain):
        if isinstance(datain,int):
            listTemp = []
            listTemp.append(datain)
            d = bytes(listTemp)
            self.m_serialPort.write(d)        else:            if isinstance(datain,str):
                d = datain.encode('utf-8')
                self.m_serialPort.write(d)    def ScomGetintData(self):
        n = self.m_serialPort.inWaiting()        if n:
            data = self.m_serialPort.read(n).hex()            #writefile
            print(data)    def ScomGetstrData(self):
        if self.m_serialPort.is_open:
            n = self.m_serialPort.inWaiting()            if n > 0:
                data = self.m_serialPort.read(n).decode('GB2312',errors='ignore')                return data    def run(self):
        cnt = 50

        while cnt <= 3000:
            sendstr = str(cnt)            if len(sendstr) == 2:
                sendstr = &#39;00&#39; + sendstr            else:                if len(sendstr) == 3:
                    sendstr = &#39;0&#39; + sendstr

            self.ScomSendOneData(&#39;SET&#39; + sendstr + &#39;V&#39;)
            cnt = cnt + 5
            print(&#39;此时设置电压为:&#39; + sendstr + &#39;V&#39;)
            time.sleep(2)

sind unter ihren Namen bekannt und sind hier nicht dargestellt. Hier geht es hauptsächlich um die Ausführungsfunktion, die eine Schleife um 50 bis 3000 implementiert und den Inhalt von SET0050V an SET3000V sendet. Wenn diese Funktion nicht benötigt wird, Die Ausführungsfunktion kann geschrieben werden als

    def run(self):
        while true:
            time.sleep(2)

Schnittstelle Wir verwenden die von QtDesigner erstellte UI-Datei, um die py-Datei über pyUIC zu generieren


Python PyQT-Multithread-Codeanalyse für serielle Ports
Der generierte Code lautet wie folgt (zu lang, nur die ersten paar Zeilen sind übrig)

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file &#39;CashUpdateUI11v.ui&#39;## Created by: PyQt5 UI code generator 5.6## WARNING! All changes made in this file will be lost!from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_cash(object):
    def setupUi(self, cash):
    **
    **
    **

Erstellen Sie zu diesem Zeitpunkt eine neue Klasse MyWindow, erben Sie QMainWindow und Ui_cash und erstellen Sie ein SerialThread-Mitglied innerhalb der Klasse
Der Gesamtcode lautet wie folgt:

class MyWindow(QMainWindow,Ui_cash):
    def __init__(self):
        super(MyWindow,self).__init__()
        self.scomList = []
        self.threadList = []
        self.setupUi(self)
        self.actionOpen.triggered.connect(self.openMsg)
        self.actionSave.triggered.connect(self.saveMsg)
        self.pushButton.clicked.connect(self.ScomAutoFind)
        self.addDataButton.clicked.connect(self.getRHandT)

        self.tableWidget.setColumnCount(5)
        self.tableWidget.setRowCount(1)
        self.tableWidget.setHorizontalHeaderLabels([&#39;11&#39;, &#39;22&#39;, &#39;33&#39;, &#39;44&#39;, &#39;55&#39;])
        self.tableRowCnt = 0
        self.tableColumnCnt = 0
        self.ThreadComID = 0
        self.addDatasignal = pyqtSignal(str)
        self.datadict = {&#39;RHldy&#39;:0,&#39;Tldy&#39;:0,&#39;meaRT&#39;:0,&#39;voltport&#39;:0}    def getMCUdata(self):
        if self.ThreadComID == 0:
            self.showMsgbox(&#39;请先连接串口&#39;)        else:
            self.ThreadComID.ScomSendOneData(&#39; 5501AA&#39;)
            time.sleep(0.1)
            strt = self.ThreadComID.ScomGetstrData()            if strt is None:
                self.showMsgbox(&#39;请将串口线连接到电路板&#39;)                return None
            print(strt)
            self.datadict[&#39;voltport&#39;] = strt[4:-3] + &#39;.&#39; + strt[-3:-2]
            self.ThreadComID.ScomSendOneData(&#39; 5502AA&#39;)
            time.sleep(0.1)
            strt = self.ThreadComID.ScomGetstrData()            if strt is None:
                self.showMsgbox(&#39;请将串口线连接到电路板&#39;)                return None
            print(strt)
            self.datadict[&#39;meaRT&#39;] = strt[4:-4] + &#39;.&#39; + strt[-4:-2]            return 1


    def insertTableNewLine(self):
        self.tableWidget.setItem(self.tableRowCnt, 0, QTableWidgetItem(self.datadict[&#39;RHldy&#39;]))
        self.tableWidget.setItem(self.tableRowCnt, 1, QTableWidgetItem(self.datadict[&#39;Tldy&#39;]))
        self.tableWidget.setItem(self.tableRowCnt, 2, QTableWidgetItem(self.datadict[&#39;meaRT&#39;]))
        self.tableWidget.setItem(self.tableRowCnt, 3, QTableWidgetItem(self.datadict[&#39;voltport&#39;]))
        self.tableWidget.setItem(self.tableRowCnt, 4, QTableWidgetItem(str(datetime.date.today())+&#39; &#39;+str(datetime.datetime.today().hour)+&#39;:&#39;+str(datetime.datetime.today().minute)))
        self.tableRowCnt += 1
        self.tableWidget.insertRow(self.tableRowCnt)    def openMsg(self):
        file,ok = QFileDialog.getOpenFileName(self,"打开记录表","C:/",".txt")    def getRHandT(self):
        if self.ThreadComID == 0:
            self.showMsgbox(&#39;请先连接串口&#39;)        else:
            data,ok = QInputDialog.getText(self, "露点仪数据", "按如下格式记录:\n  RH空格T\n示例:\n  RH(0~100):66.6\n  T(0~200):9.8\n  输入:66.6 9.8", QLineEdit.Normal, "66.6 9.8" )            if ok == True:
                data = re.findall(&#39;^[0-9]+\.[0-9]+\s+[0-9]+\.[0-9]+$&#39;, data.rstrip())                if len(data) == 0:
                    self.showMsgbox(&#39;数据格式有误,重新录入&#39;)                else:
                    data = data[0].split()
                    print(data)
                    self.datadict[&#39;RHldy&#39;] = data[0]
                    self.datadict[&#39;Tldy&#39;] = data[1]                    if self.getMCUdata() is None:                        return None
                    print(self.datadict)
                    self.insertTableNewLine()            else:
                self.showMsgbox(&#39;请重新录入数据&#39;)    def showMsgbox(self,strtoshow):
        QMessageBox.warning(self,&#39;提示&#39;,strtoshow,QMessageBox.Ok)    def saveMsg(self):
        file,ok = QFileDialog.getSaveFileName(self,"保存记录表","C:/",".txt")    def ScomAutoFind(self):
        self.pushButton.setDisabled(True)
        self.scomList = list(serial.tools.list_ports.comports())        if len(self.scomList) <= 0:
            self.showMsgbox(&#39;未发现串口,请检查线缆连接&#39;)
            self.pushButton.setDisabled(False)        else:
            comNum = len(self.scomList)
            print(str(comNum) + &#39;Scom is found&#39;)            while comNum:
                comNum = comNum - 1
                if "USB" in str(self.scomList[comNum]):
                    self.ThreadComID = SerialThread(portName=self.scomList[comNum][0])
                    self.ThreadComID.start()
                    self.graphicsView.setStyleSheet("background-color: rgb(0, 255, 0);")
                    print(str(self.scomList[comNum]) + &#39; is added&#39;)

Weil ich RS232 zu USB verwende, ist der Gerätename USB-SERIAL CH340. Natürlich gibt es auch andere RS232 zu USB-Chips, z wie PL2303 usw. Ich überprüfe hier nur, ob der USB im Gerätenamen enthalten ist, ohne den vollständigen Namen zu überprüfen. Er muss entsprechend den tatsächlichen Anforderungen geändert werden
Python PyQT-Multithread-Codeanalyse für serielle Ports
Der letzte ist der Hauptname, nichts Besonderes

if __name__ == "__main__":
    app = QApplication(sys.argv)
    myshow = MyWindow()
    myshow.show()    print(&#39;程序终止&#39;)
    sys.exit(app.exec_())

Sehen Sie sich den tatsächlichen Betriebseffekt an:
Tatsächlicher Vorgang (Hinzufügen von Daten und Datenaufzeichnungstabelle ignorieren...)
Python PyQT-Multithread-Codeanalyse für serielle Ports
Nach dem Klicken auf „Verbinden“
Python PyQT-Multithread-Codeanalyse für serielle Ports
Klicken zum Hinzufügen von Daten ist natürlich kein Problem. Deha
Python PyQT-Multithread-Codeanalyse für serielle Ports

stellt alle Projektdateien zur Verfügung, der Link lautet wie folgt:
https://download.csdn. net/download/ysgjiangsu/10324162

Das obige ist der detaillierte Inhalt vonPython PyQT-Multithread-Codeanalyse für serielle Ports. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn