ホームページ  >  記事  >  バックエンド開発  >  Python PyQT マルチスレッド シリアル ポート コード分析

Python PyQT マルチスレッド シリアル ポート コード分析

零到壹度
零到壹度オリジナル
2018-04-03 14:22:146198ブラウズ

この記事では主に Python の PyQT マルチスレッド シリアル ポート コード解析を紹介します。編集者が非常に優れていると考えたので、参考として共有します。エディターと一緒に覗いてみてください

このブログは主にPyQTマルチスレッドシリアルポートのメインコード解析を記録しています
プロジェクトのソースコードファイルは記事の最後にあります

まず、PyCharmからQtDesignerを起動します。


Python PyQT マルチスレッド シリアル ポート コード分析
これは以前に顧客向けに行われたものです。ホスト コンピューターでは、機密保持のため、ブロック図コンポーネントのほとんどが削除されていますが、これはこのシリアル ポート チュートリアルには影響しません。
QtDesigner インターフェイスは次のとおりです。


Python PyQT マルチスレッド シリアル ポート コード分析
ここでは使用されないため、データの追加とテーブルデータの表示を無視します
クラス構成に焦点を当てます
QtCore.QThreadから継承した新しいシリアルポートクラスSerialThreadを作成して、すべてのシリアルポートトランシーバー機能を実現します

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)

機能は十分です- 名前で知られているため、ここには示されていません。ここでは主に run 関数について説明します。run 関数は 50 から 3000 に進み、コンテンツを SET0050V から SET3000V に送信するループを実装します。 run 関数は次のように記述できます

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

Interface QtDesigner で作成された ui ファイルを使用して、pyUIC を通じて py ファイルを生成します


Python PyQT マルチスレッド シリアル ポート コード分析
生成されたコードは次のとおりです (長すぎるため、最初の数行のみが残っています)

# -*- 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):
    **
    **
    **

この時点で、QMainWindow と Ui_cash を継承する新しいクラス MyWindow を作成し、クラス内に SerialThread メンバーを作成します
全体のコードは次のとおりです:

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;)

RS232 to USB を使用してコンピューターに接続しているため、デバイス名は USB-SERIAL CH340 です。もちろん、PL2303 などの他の RS232 to USB チップもあります。ここでは、フルネームを確認せずに、USB がデバイス名のみに含まれているかどうかを確認するだけです。これは実際のニーズに応じて変更する必要があります
Python PyQT マルチスレッド シリアル ポート コード分析
最後のものはメインであり、特別なものではありません

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

実際の実行結果を見てください:
実際の実行 (データレコードテーブルを使用してデータの追加を無視します...)
Python PyQT マルチスレッド シリアル ポート コード分析
接続をクリックした後、
Python PyQT マルチスレッド シリアル ポート コード分析
もちろん、クリックしてデータを追加しても問題ありません
Python PyQT マルチスレッド シリアル ポート コード分析

ここにすべてのプロジェクトファイルがあります。リンクは次のとおりです:
https://download.csdn.net /download/ysgjiangsu/10324162

以上がPython PyQT マルチスレッド シリアル ポート コード分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。