[pyqt5+pyserial]python实现modbus串口通信

Test.py实现GUI界面和大部分逻辑 

# -*- coding: utf-8 -*-

from PyQt5.QtCore import QDateTime, Qt, QTimer, pyqtSignal, QThread
from PyQt5.QtWidgets import (QApplication, QCheckBox, QComboBox, QDateTimeEdit,
        QDial, QDialog, QGridLayout, QGroupBox, QHBoxLayout, QLabel, QLineEdit,
        QProgressBar, QPushButton, QRadioButton, QScrollBar, QSizePolicy,
        QSlider, QSpinBox, QStyleFactory, QTableWidget, QTabWidget, QTextEdit,
        QVBoxLayout, QWidget, QMessageBox)
from PyQt5.QtGui import (QIntValidator)
import serial
import serial.tools.list_ports
import crcmod.predefined
import Func
import time
import threading

class WidgetGallery(QDialog):

    # global dict1
    # dict1 = {'SUM': '0000'}
    sig = pyqtSignal(str, str, float, str, str, str)

    def __init__(self, parent=None):
        super(WidgetGallery, self).__init__(parent)
        self.originalPalette = QApplication.palette()

        self.comComboBox = QComboBox()
        # print(self.getPort())


        # self.comComboBox.currentIndexChanged.connect(self.selectionchange)
        # print(self.comComboBox.currentText())
        self.pasg = '1'  # 默认通道为1,不然初始化bug
        self.serFlag = False
        comLabel = QLabel("串口:")
        comLabel.setBuddy(self.comComboBox)


        self.bpsComboBox = QComboBox()
        self.bpsComboBox.addItems(self.getBps())

        bpsLabel = QLabel("波特率:")
        bpsLabel.setBuddy(self.bpsComboBox)

        self.crcComboBox = QComboBox()
        self.crcComboBox.addItems(self.getCrc())

        crcLabel = QLabel("校验:")
        crcLabel.setBuddy(self.crcComboBox)

        self.openButton = QPushButton("打开串口")
        self.openButton.setDefault(False)
        self.openButton.clicked.connect(self.openSer)
        self.openButton.setCheckable(True)
        # self.openButton.setAutoExclusive(True)
        # self.openButton.setEnabled(False)
        # print(self.getPort())
        self.comComboBox.addItems(self.getPort())


        # self.open1Button = QPushButton("go03")
        # self.open1Button.setDefault(False)
        # self.staNum = '01'
        # self.funCode = '03'
        # self.keyName = 'SUM'
        # self.open1Button.clicked.connect(self.sendFunction03(staNum, funCode, keyName))
        # self.open1Button.clicked.connect(self.Print)
        # self.open1Button.clicked.connect(self.sendFunction03)

        self.setWindowFlags(Qt.Widget)
        self.setWindowTitle("ST05D校准软件")
        self.resize(600, 400)
        self.setFixedSize(600, 400)
        self.changeStyle('windowsvista')

        topLayout = QHBoxLayout()
        topLayout.addWidget(comLabel)
        topLayout.addWidget(self.comComboBox)
        topLayout.addWidget(bpsLabel)
        topLayout.addWidget(self.bpsComboBox)
        topLayout.addWidget(crcLabel)
        topLayout.addWidget(self.crcComboBox)
        topLayout.addSpacing(50)
        topLayout.addWidget(self.openButton)
        # topLayout.addWidget(self.open1Button)
        topLayout.addStretch(1)

        self.createTopLeftGroupBox()
        self.createTopRightGroupBox()
        self.createMiddleLeftGroupBox()
        self.createMiddleRightGroupBox()
        self.createBottomLeftGroupBox()
        self.createBottomRightGroupBox()

        mainLayout = QGridLayout()
        mainLayout.addLayout(topLayout, 0, 0, 1, 2)
        mainLayout.addWidget(self.topLeftGroupBox, 1, 0)
        mainLayout.addWidget(self.topRightGroupBox, 1, 1)
        mainLayout.addWidget(self.middleLeftGroupBox, 2, 0)
        mainLayout.addWidget(self.middleRightGroupBox, 2, 1)
        mainLayout.addWidget(self.bottomLeftGroupBox, 3, 0)
        mainLayout.addWidget(self.bottomRightGroupBox, 3, 1)
        mainLayout.setColumnStretch(0, 1)
        mainLayout.setColumnStretch(1, 1)

        self.setLayout(mainLayout)


    # def Print(self):
    #     print('print')


    def closeEvent(self, event):
        # self.c.terminate()
        print('thread=sta', self.readthread._running)
        self.readthread.terminate()
        print('close')

    def openSer(self):
        print('open')
        print(self.openButton.isChecked())
        if self.openButton.isChecked():
            self.ser = serial.Serial(self.comComboBox.currentText(), self.bpsComboBox.currentText(), timeout=0)
            self.comComboBox.setEnabled(False)
            self.bpsComboBox.setEnabled(False)
            self.crcComboBox.setEnabled(False)
            self.openButton.setText('关闭串口')
        else:
            print('no')
            self.ser.close()
            self.openButton.setText('打开串口')
            self.comComboBox.setEnabled(True)
            self.bpsComboBox.setEnabled(True)
            self.crcComboBox.setEnabled(True)
        # if not self.serFlag:
        #     self.ser = serial.Serial(self.comComboBox.currentText(), self.bpsComboBox.currentText(), timeout=0)
        #     self.serFlag = True
        #     print(self.comComboBox.currentText(), self.bpsComboBox.currentText())
        # else:
        #     self.ser.close()
        #     self.serFlag = False
        #     self.openSer()

    # def sendFunction03(self, staNum, funCode, keyName):
    def send03(self, keyName):
        try:
            staNum = self.staNum
            # funCode = self.funCode
            # keyName = self.keyName
        except Exception:
            staNum = '00'
        # keyName = self.keyName
        funCode = '03'
        print('033')
        if self.openButton.isChecked():
            list1 = Func.sendFunction03(staNum, funCode, keyName)
            # list1 = []
            # dict1 = Func.addressDict03
            # list1.append(int('0x' + staNum, 16))
            # list1.append(int('0x' + funCode, 16))
            # list1.append(int('0x' + dict1[keyName][0:2], 16))
            # list1.append(int('0x' + dict1[keyName][2:4], 16))
            # list1.append(int('0x00', 16))
            # list1.append(int('0x02', 16))
            # crc16_func = crcmod.predefined.mkCrcFun('modbus')
            # # ba = bytearray([0o01, 0o03, 0o00, 0o00, 0o00, 0o02])
            # a = bytes().fromhex(staNum + funCode + dict1[keyName] + '0002')
            # # print(a)
            # reslist = hex(crc16_func(a))[2:].zfill(4)
            # # print(type(reslist[2:].upper()), reslist[:2].upper())
            # list1.append(int('0x' + reslist[2:], 16))
            # list1.append(int('0x' + reslist[:2], 16))
            print(list1)
            try:
                self.ser.write(list1)
            except Exception:
                print('not ok')
                reply = QMessageBox.warning(self,
                                            "串口设置错误",
                                            "请检查串口号及波特率设置",
                                            QMessageBox.Yes | QMessageBox.No)
                # self.echo(reply)
            else:
                print(type(self.ser.read()))
                result16 = str(self.ser.read(), encoding="utf8")[6:14]  # 去掉从站号功能码crc校验码等,只保留读取值
                print(result16)
                if len(result16) == 0:
                    reply = QMessageBox.warning(self,
                                                "地址读取空",
                                                "请检查串口设置",
                                                QMessageBox.Yes | QMessageBox.No)
                elif keyName == 'DN':  # 获取从站地址
                    # result10 = int('0x' + result16[2:], 16)  # 先实现只读后两位
                    result10 = Func.hex8ToInt(result16)
                    self.AdrlineEdit.setText(result10)
                elif 'SENSE' in keyName:  # 获取灵敏度
                    result10 = Func.hex8ToInt(result16)
                    self.SenlineEdit.setText(result10)
                elif keyName == 'SUM':  # 返回读取总和
                    return Func.hex8ToInt(result16)
        else:
            reply = QMessageBox.warning(self,
                                        "串口设置错误",
                                        "请打开串口",
                                        QMessageBox.Yes | QMessageBox.No)
    # return list1

    # def hex8ToInt(s):
    #     s = '{:032b}'.format(int(s, 16))
    #     return int(s[1:], 2) - int(s[0]) * (1 << 31)
    #
    # def intToHex8(i):
    #     return '{:08x}'.format(int((bin(((1 << 32) - 1) & i)[2:]).zfill(32), 2))

    def changeStyle(self, styleName):
        QApplication.setStyle(QStyleFactory.create(styleName))
        self.changePalette()

    # def selectionchange(self):
    #     print('selectionchange', self.comComboBox.currentText())

    def changePalette(self):
        QApplication.setPalette(self.originalPalette)

    def getPort(self):
        port_list = list(serial.tools.list_ports.comports())
        plist = []
        print(len(port_list))
        if len(port_list) == 0:
            reply = QMessageBox.warning(self,
                                        "没有串口设备",
                                        "请检查串口设备连接",
                                        QMessageBox.Yes | QMessageBox.No)
            self.openButton.setEnabled(False)
            return plist
        else:
            for p in port_list:
            #     print('device:', p.device, 'des:', p.description, 'hwid:', p.hwid)
                plist.append(p.device)
            return plist

    def getBps(self):
        listBps = ['9600', '19200', '38400', '57600', '115200']
        return listBps

    def getCrc(self):
        listCrc = ['无校验', '奇校验', '偶校验']
        return listCrc

    def setAdr(self):  # 设定从站地址
        # print('okk')
        if self.openButton.isChecked():
            # print('okk1')
            # print(type(self.AdrlineEdit.text()), self.AdrlineEdit.text())
            self.staNum = self.AdrlineEdit.text()
            # self.staNum = '1'
        else:
            # print('okk2')
            reply = QMessageBox.warning(self,
                                        "串口设置错误",
                                        "请打开串口",
                                        QMessageBox.Yes | QMessageBox.No)

    def setPasg(self):  # 设定通道
        if self.openButton.isChecked():
            # print(self.pasgBox.currentText())
            self.pasg = self.pasgBox.currentText()
            print(type(self.pasg))
        else:
            reply = QMessageBox.warning(self,
                                        "串口设置错误",
                                        "请打开串口",
                                        QMessageBox.Yes | QMessageBox.No)
    #
    def test11(self, str):
        if str == 'ok':
            return 1

    def displayRead(self, num):
        self.NumlineEdit.setText(num)

    def warnNoneRead(self):
        print('warnNoneRead')
        reply = QMessageBox.warning(self,
                                    "地址读取空",
                                    "请检查串口设置",
                                    QMessageBox.Yes | QMessageBox.No)

    def readNum(self):  # 要做循环读数
        if self.openButton.isChecked():
            # print('okgo1', self.readNumButton.isChecked())
            if self.readNumButton.isChecked():
                print('okgo')
                self.topLeftGroupBox.setEnabled(False)
                self.topRightGroupBox.setEnabled(False)
                # self.middleLeftGroupBox.setEnabled(False)
                self.numComboBox.setEnabled(False)
                self.unitComboBox.setEnabled(False)
                self.clearButton.setEnabled(False)
                self.middleRightGroupBox.setEnabled(False)
                self.bottomLeftGroupBox.setEnabled(False)
                self.bottomRightGroupBox.setEnabled(False)
                self.openButton.setEnabled(False)
                self.comComboBox.setEnabled(False)
                self.bpsComboBox.setEnabled(False)
                self.crcComboBox.setEnabled(False)
                self.readNumButton.setText('停止读数')
                # self.readNumButton.setEnabled(True)
                #
                numPasg = self.numComboBox.currentText()
                unit = self.unitComboBox.currentText()
                mult = 0.0000357628
                i = 0
                try:
                    staNum = self.staNum
                    # funCode = self.funCode
                    # keyName = self.keyName
                    print('ok')
                except Exception:
                    staNum = '00'
                    print('no')
                print(numPasg, unit, staNum)
                # self.sigSetNum.connect(self.displayRead)
                # print(1)
                self.ser.close()
                # print(2, type(numPasg), type(unit), type(mult), type(self.comComboBox.currentText()), type(self.bpsComboBox.currentText()), type(staNum))
                self.sig.emit(numPasg, unit, mult, self.comComboBox.currentText(), self.bpsComboBox.currentText(), staNum)
                # print(3)
                # numPasg=numPasg, unit=unit, mult=mult, ser=self.ser, staNum=self.staNum
                self.readthread.start()
                # self.t = threading.Thread(target=self.c.run, args=(numPasg, unit, mult,))
                # self.t.start()

                # while self.readNumButton.isChecked():
                #
                #     print(i, numPasg, unit)
                #     time.sleep(1)
            else:
                # print('terminate-out')
                # self.c.terminate()
                self.readthread.terminate()
                self.ser = serial.Serial(self.comComboBox.currentText(), self.bpsComboBox.currentText(), timeout=0)
                # print('terminate-out2')
                self.readNumButton.setText('开始读数')
                self.topLeftGroupBox.setEnabled(True)
                self.topRightGroupBox.setEnabled(True)
                # self.middleLeftGroupBox.setEnabled(False)
                self.numComboBox.setEnabled(True)
                self.unitComboBox.setEnabled(True)
                self.clearButton.setEnabled(True)
                self.middleRightGroupBox.setEnabled(True)
                self.bottomLeftGroupBox.setEnabled(True)
                self.bottomRightGroupBox.setEnabled(True)
                self.openButton.setEnabled(True)
                self.comComboBox.setEnabled(True)
                self.bpsComboBox.setEnabled(True)
                self.crcComboBox.setEnabled(True)
                # self.readNumButton.setEnabled(False)
        else:
            reply = QMessageBox.warning(self,
                                        "串口设置错误",
                                        "请打开串口",
                                        QMessageBox.Yes | QMessageBox.No)

    def clearNum(self):
        self.NumlineEdit.clear()

    def createTopLeftGroupBox(self):
        self.topLeftGroupBox = QGroupBox("")
        self.readAdrButton = QPushButton("读取地址")

        self.readAdrButton.clicked.connect(lambda: self.send03('DN'))
        # print(self.ser.read())
        self.readAdrButton.setDefault(False)
        self.setAdrButton = QPushButton("设定地址")
        self.setAdrButton.setDefault(False)
        self.setAdrButton.clicked.connect(self.setAdr)
        self.setPasgButton = QPushButton("设定通道")
        self.setPasgButton.setDefault(False)
        self.setPasgButton.clicked.connect(self.setPasg)
        layout = QHBoxLayout()
        list1 = ['1', '2', '3', '4', '5']

        layout1 = QVBoxLayout()
        self.AdrlineEdit = QLineEdit('0')
        # self.AdrlineEdit.setPlaceholderText('0')
        pIntValidator = QIntValidator()
        pIntValidator.setRange(0, 255)
        self.AdrlineEdit.setValidator(pIntValidator)
        layout1.addWidget(self.AdrlineEdit)
        self.pasgBox = QComboBox()
        self.pasgBox.addItems(list1)
        layout1.addWidget(self.pasgBox)
        # layout1.addStretch(1)

        layout2 = QVBoxLayout()
        layout2.addWidget(self.readAdrButton)
        layout2.addWidget(self.setAdrButton)
        layout2.addWidget(self.setPasgButton)
        # layout2.addStretch(1)

        layout.addSpacing(10)
        layout.addLayout(layout1)
        layout.addSpacing(50)
        # layout.addStretch(1)
        layout.addLayout(layout2)
        layout.setStretchFactor(layout1, 1)
        layout.setStretchFactor(layout2, 1)
        # layout.addStretch(1)
        self.topLeftGroupBox.setLayout(layout)

    def createTopRightGroupBox(self):
        self.topRightGroupBox = QGroupBox("出厂校准")
        self.readSenButton = QPushButton("读取灵敏度")
        self.readSenButton.setDefault(False)
        self.readSenButton.clicked.connect(lambda: self.send03('CH'+self.pasg+'SENSE'))
        # print('11')
        # staNum = '01'
        # funCode = '03'
        # keyName = 'SUM'
        # self.read1Button.clicked.connect(self.sendFunction03)
        layout = QVBoxLayout()
        layout1 = QHBoxLayout()
        styleLabel = QLabel("灵敏度:")
        self.SenlineEdit = QLineEdit('2000')
        self.SenlineEdit.setReadOnly(True)
        # lineEdit.setEnabled(False)
        styleLabel.setBuddy(self.SenlineEdit)
        layout1.addWidget(styleLabel)
        layout1.addWidget(self.SenlineEdit)
        layout1.addSpacing(20)
        layout1.addWidget(self.readSenButton)

        layout2 = QHBoxLayout()
        style1Label = QLabel("满量程请用模拟器2mv/v进行校准!")
        layout2.addWidget(style1Label)

        layout3 = QHBoxLayout()
        set1Button = QPushButton("校准零点")
        set1Button.setDefault(False)
        set2Button = QPushButton("校准满度")
        set2Button.setDefault(False)
        layout3.addWidget(set1Button)
        layout3.addWidget(set2Button)

        layout.addLayout(layout1)
        layout.addLayout(layout2)
        layout.addLayout(layout3)
        self.topRightGroupBox.setLayout(layout)

    def createMiddleLeftGroupBox(self):
        self.middleLeftGroupBox = QGroupBox("显示值读取")
        comLabel = QLabel("小数点数:")
        self.NumlineEdit = QLineEdit('0')
        # lineEdit.setEnabled(False)
        self.NumlineEdit.setReadOnly(True)
        self.readNumButton = QPushButton("开始读数")
        self.readNumButton.setDefault(False)
        self.readthread = readThread()
        self.sig.connect(self.readthread.on_source)
        self.readthread.trigger.connect(self.displayRead)
        self.readthread.trigger1.connect(self.warnNoneRead)
        self.readNumButton.clicked.connect(self.readNum)
        self.readNumButton.setCheckable(True)
        # self.readNumButton.setAutoExclusive(True)
        self.clearButton = QPushButton("清零")
        self.clearButton.setDefault(False)
        # self.clearButton.clicked.connect(self.clearNum)
        # defaultPushButton.setDefault(False)
        numList = ['0', '1', '2', '3', '4', '5']
        self.numComboBox = QComboBox()
        self.numComboBox.addItems(numList)
        unitList = ['g', 'Kg', 'N', 'KN']
        self.unitComboBox = QComboBox()
        self.unitComboBox.addItems(unitList)
        layout = QHBoxLayout()
        layout1 = QVBoxLayout()
        layout1.addWidget(comLabel)
        layout1.addWidget(self.NumlineEdit)
        layout1.addSpacing(10)
        layout1.addWidget(self.readNumButton)

        layout2 = QVBoxLayout()
        layout2.addWidget(self.numComboBox)
        layout2.addSpacing(10)
        layout2.addWidget(self.unitComboBox)
        layout2.addSpacing(10)
        layout2.addWidget(self.clearButton)
        layout.addLayout(layout1)
        layout.addSpacing(50)
        layout.addLayout(layout2)
        layout.setStretchFactor(layout1, 1)
        layout.setStretchFactor(layout2, 1)
        self.middleLeftGroupBox.setLayout(layout)

    def createMiddleRightGroupBox(self):
        self.middleRightGroupBox = QGroupBox("多段标定")
        styleLabel = QLabel("当前载荷值:")
        lineEdit = QLineEdit('0')
        styleLabel.setBuddy(lineEdit)
        style1Label = QLabel("当前标定点数:")
        line1Edit = QLineEdit('1')
        line1Edit.setReadOnly(True)
        line2Edit = QLineEdit('WAIT !')
        line2Edit.setReadOnly(True)
        styleLabel.setBuddy(line1Edit)
        self.setCalButton = QPushButton("标定此点")
        self.setCalButton.setDefault(False)
        finishButton = QPushButton("完成标定")
        finishButton.setDefault(False)

        layout1 = QHBoxLayout()
        layout1.addWidget(styleLabel)
        layout1.addWidget(lineEdit)
        layout1.addSpacing(20)
        layout1.addWidget(style1Label)
        layout1.addWidget(line1Edit)

        layout2 = QHBoxLayout()
        layout2.addWidget(line2Edit)
        layout2.addSpacing(20)
        layout2.addWidget(self.setCalButton)
        layout2.addSpacing(20)
        layout2.addWidget(finishButton)

        layout = QVBoxLayout()
        layout.addLayout(layout1)
        layout.addSpacing(20)
        layout.addLayout(layout2)

        self.middleRightGroupBox.setLayout(layout)

    def createBottomLeftGroupBox(self):
        self.bottomLeftGroupBox = QGroupBox("参数修改")
        styleLabel = QLabel("修改参数:")
        style1Label = QLabel("修改值:")
        self.setList = ['', 'AD采样速率', '滤波等级', '滤波带', '零点跟踪时间', '零点跟踪带', '判稳时间', '判稳条件', '设备地址',
                   '波特率', '校验位', '高低寄存器选择', '报警1模式', '报警1跟踪通道', '报警1报警值', '报警1区间值', '报警2模式',
                   '报警2跟踪通道', '报警2报警值', '报警2区间值']
        setComboBox = QComboBox()
        setComboBox.addItems(self.setList)
        # method.fun1(self.setList)
        lineEdit = QLineEdit('')
        self.readParButton = QPushButton("读取参数值")
        self.readParButton.setDefault(False)
        self.chgButton = QPushButton("修改参数值")
        self.chgButton.setDefault(False)
        layout = QVBoxLayout()

        layout1 = QHBoxLayout()
        layout1.addWidget(styleLabel)
        layout1.addSpacing(50)
        layout1.addWidget(setComboBox)

        layout2 = QHBoxLayout()
        layout2.addWidget(style1Label)
        layout2.addSpacing(108)
        layout2.addWidget(lineEdit)

        layout3 = QHBoxLayout()
        layout3.addWidget(self.readParButton)
        layout3.addWidget(self.chgButton)

        layout.addLayout(layout1)
        layout.addLayout(layout2)
        layout.addLayout(layout3)
        self.bottomLeftGroupBox.setLayout(layout)

    def createBottomRightGroupBox(self):
        self.bottomRightGroupBox = QGroupBox("Key方式校准")
        self.enaCalButton = QPushButton("校准使能")
        self.enaCalButton.setDefault(False)
        conButton = QPushButton("确定校准")
        conButton.setDefault(False)
        styleLabel = QLabel("灵敏度:")
        lineEdit = QLineEdit('0')
        lineEdit.setBaseSize(13, 13)
        layout = QVBoxLayout()

        layout1 = QHBoxLayout()
        layout1.addWidget(styleLabel)
        layout1.addSpacing(50)
        layout1.addWidget(lineEdit)

        layout2 = QHBoxLayout()
        layout2.addWidget(self.enaCalButton)
        layout2.addSpacing(50)
        layout2.addWidget(conButton)

        layout.addLayout(layout1)
        layout.addLayout(layout2)

        self.bottomRightGroupBox.setLayout(layout)


class readThread(QThread):
    trigger = pyqtSignal(str)
    trigger1 = pyqtSignal()
    # print('thread init')
    # def __init__(self):
    #     self._running = True
    #     # self.obj = obj

    def __init__(self):  # do_create_data放在最后
        super().__init__()
        self._running = True
        self.numPasg = None
        self.unit = None
        self.mult = None
        # self.ser = None
        self.com = None
        self.bps = None
        self.staNum = None
        self.init_flag = False
        print('thread init1')

    def on_source(self, numPasg, unit, mult, com, bps, staNum):
        self.init_flag = True
        self.numPasg = numPasg
        self.unit = unit
        self.mult = mult
        # self.ser = ser
        self.ser = serial.Serial(com, bps, timeout=0)
        self.staNum = staNum
        self._running = True
        print('on_source')

    def threadsend03(self, keyName):
        try:
            staNum = self.staNum
        except Exception:
            staNum = '00'
        # keyName = self.keyName
        funCode = '03'
        print('threadsend03')
        list1 = Func.sendFunction03(staNum, funCode, keyName)
        print(list1)
        try:
            self.ser.write(list1)
        except Exception:
            print('not ok')
            # reply = QMessageBox.warning(self,
            #                             "串口设置错误",
            #                             "请检查串口号及波特率设置",
            #                             QMessageBox.Yes | QMessageBox.No)
            # self.echo(reply)
        else:
            print(type(self.ser.read()))
            result16 = str(self.ser.read(), encoding="utf8")[6:14]  # 去掉从站号功能码crc校验码等,只保留读取值
            print(result16)
            if len(result16) == 0:
                print('thread null')
                # reply = QMessageBox.warning(self,
                #                             "地址读取空",
                #                             "请检查串口设置",
                #                             QMessageBox.Yes | QMessageBox.No)
                self.trigger1.emit()
                # pass  # emit
                return None
            elif keyName == 'SUM':  # 返回读取总和
                return Func.hex8ToInt(result16)
            elif 'PV' in keyName:  # 返回单通道读取
                return Func.hex8ToInt(result16)

    def terminate(self):
        print('gg')
        # print('terminate-in', self.ser.is_open)
        self._running = False
        if self.init_flag:
            self.ser.close()
            print('what')

    def run(self):

        print('run')
        while self._running:
            # print('T-minus', numPasg, unit, mult)
            if self.numPasg == '0':
                returnNum = self.threadsend03('SUM')
                # returnNum = WidgetGallery.test11(QDialog, 'ok')
                if returnNum == None:
                    break
                else:
                    displayNum = returnNum * self.mult
            else:
                returnNum = self.threadsend03('PV'+self.numPasg)  # 6是什么意思?
                # returnNum = WidgetGallery.test11(QDialog, 'ok')
                if returnNum == None:
                    break
                else:
                    displayNum = returnNum * self.mult  # kg
            if self.unit == 'g':
                finalNum = displayNum * 1000
            elif self.unit == 'Kg':
                finalNum = displayNum
            elif self.unit == 'N':
                finalNum = displayNum * 9.8
            elif self.unit == 'KN':
                finalNum = (displayNum * 9.8)/1000
            #     finalNum = i
            #     self.NumlineEdit.setText(str(finalNum))
            #     i += 1
            self.trigger.emit(str(finalNum))
            # setNumSignal.emit(str(finalNum))
            # numPasg += '1'
            time.sleep(1)

if __name__ == '__main__':

    import sys

    app = QApplication(sys.argv)
    gallery = WidgetGallery()
    gallery.show()
    sys.exit(app.exec_())

Func.py实现具体交互指令

import serial

import serial.tools.list_ports
import crcmod.predefined

addressDict01={
    'PC1': '000B',
    'PC2': '000C',
    'PC3': '000D',
    'PC4': '000E',
    'PC5': '000F',
    'SC1': '0011',
    'SC2': '0012',
    'SC3': '0013',
    'SC4': '0014',
    'SC5': '0015'
}
addressDict05= {
    'TC': '000A',
    'PC1': '000B',
    'PC2': '000C',
    'PC3': '000D',
    'PC4': '000E',
    'PC5': '000F',
    'cal': '0010',
    'Tbu': '0011',
    'Tfc': '0013'
}
addressDict03= {
    'SUM': '0000',
    'PV1': '0002',
    'PV2': '0004',
    'PV3': '0006',
    'PV4': '0008',
    'PV5': '000A',
    'CH1SENSE': '000C',
    'CH1INP1': '000E',
    'CH1INP2': '0010',
    'CH1OFFSET': '0012',
    'CH1POINT': '0014',
    'CH1AVP1': '0016',
    'CH1AVP2': '0018',
    'CH1AVP3': '001A',
    'CH1AVP4': '001C',
    'CH1AVP5': '001E',
    'CH1AVP6': '0020',
    'CH1AVP7': '0022',
    'CH1AVP8': '0024',
    'CH1AVP9': '0026',
    'CH1PVP1': '0028',
    'CH1PVP2': '002A',
    'CH1PVP3': '002C',
    'CH1PVP4': '002E',
    'CH1PVP5': '0030',
    'CH1PVP6': '0032',
    'CH1PVP7': '0034',
    'CH1PVP8': '0036',
    'CH1PVP9': '0038',
    'CH1ADSSPEED': '003A',
    'CH1FILTER': '003C',
    'CH1FBAND': '003E',
    'CH1ATZT': '0040',
    'CH1ATZB': '0042',
    'CH1STBT': '0044',
    'CH1STBB': '0046',
    'CH2SENSE': '004A',
    'CH2INP1': '004C',
    'CH2INP2': '004E',
    'CH2OFFSET': '0050',
    'CH2POINT': '0052',
    'CH2AVP1': '0054',
    'CH2AVP2': '0056',
    'CH2AVP3': '0058',
    'CH2AVP4': '005A',
    'CH2AVP5': '005C',
    'CH2AVP6': '005E',
    'CH2AVP7': '0060',
    'CH2AVP8': '0062',
    'CH2AVP9': '0064',
    'CH2PVP1': '0066',
    'CH2PVP2': '0068',
    'CH2PVP3': '006A',
    'CH2PVP4': '006C',
    'CH2PVP5': '006E',
    'CH2PVP6': '0070',
    'CH2PVP7': '0072',
    'CH2PVP8': '0074',
    'CH2PVP9': '0076',
    'CH2ADSSPEED': '0078',
    'CH2FILTER': '007A',
    'CH2FBAND': '007C',
    'CH2ATZT': '007E',
    'CH2ATZB': '0080',
    'CH2STBT': '0082',
    'CH2STBB': '0084',
    'CH3SENSE': '0088',
    'CH3INP1': '008A',
    'CH3INP2': '008C',
    'CH3OFFSET': '008E',
    'CH3POINT': '0090',
    'CH3AVP1': '0092',
    'CH3AVP2': '0094',
    'CH3AVP3': '0096',
    'CH3AVP4': '0098',
    'CH3AVP5': '009A',
    'CH3AVP6': '009C',
    'CH3AVP7': '009E',
    'CH3AVP8': '00A0',
    'CH3AVP9': '00A2',
    'CH3PVP1': '00A4',
    'CH3PVP2': '00A6',
    'CH3PVP3': '00A8',
    'CH3PVP4': '00AA',
    'CH3PVP5': '00AC',
    'CH3PVP6': '00AE',
    'CH3PVP7': '00B0',
    'CH3PVP8': '00B2',
    'CH3PVP9': '00B4',
    'CH3ADSSPEED': '00B6',
    'CH3FILTER': '00B8',
    'CH3FBAND': '00BA',
    'CH3ATZT': '00BC',
    'CH3ATZB': '00BE',
    'CH3STBT': '00C0',
    'CH3STBB': '00C2',
    'CH4SENSE': '00C6',
    'CH4INP1': '00C8',
    'CH4INP2': '00CA',
    'CH4OFFSET': '00CC',
    'CH4POINT': '00CE',
    'CH4AVP1': '00D0',
    'CH4AVP2': '00D2',
    'CH4AVP3': '00D4',
    'CH4AVP4': '00D6',
    'CH4AVP5': '00D8',
    'CH4AVP6': '00DA',
    'CH4AVP7': '00DC',
    'CH4AVP8': '00DE',
    'CH4AVP9': '00E0',
    'CH4PVP1': '00E2',
    'CH4PVP2': '00E4',
    'CH4PVP3': '00E6',
    'CH4PVP4': '00E8',
    'CH4PVP5': '00EA',
    'CH4PVP6': '00EC',
    'CH4PVP7': '00EE',
    'CH4PVP8': '00F0',
    'CH4PVP9': '00F2',
    'CH4ADSSPEED': '00F4',
    'CH4FILTER': '00F6',
    'CH4FBAND': '00F8',
    'CH4ATZT': '00FA',
    'CH4ATZB': '00FC',
    'CH4STBT': '00FE',
    'CH4STBB': '0100',
    'CH5SENSE': '0104',
    'CH5INP1': '0106',
    'CH5INP2': '0108',
    'CH5OFFSET': '010A',
    'CH5POINT': '010C',
    'CH5AVP1': '010E',
    'CH5AVP2': '0110',
    'CH5AVP3': '0112',
    'CH5AVP4': '0114',
    'CH5AVP5': '0116',
    'CH5AVP6': '0118',
    'CH5AVP7': '011A',
    'CH5AVP8': '011C',
    'CH5AVP9': '011E',
    'CH5PVP1': '0120',
    'CH5PVP2': '0122',
    'CH5PVP3': '0124',
    'CH5PVP4': '0126',
    'CH5PVP5': '0128',
    'CH5PVP6': '012A',
    'CH5PVP7': '012C',
    'CH5PVP8': '012E',
    'CH5PVP9': '0130',
    'CH5ADSSPEED': '0132',
    'CH5FILTER': '0134',
    'CH5FBAND': '0136',
    'CH5ATZT': '0138',
    'CH5ATZB': '013A',
    'CH5STBT': '013C',
    'CH5STBB': '013E',
    'DN': '0142',
    'BAUD': '0144',
    'PRTY': '0146',
    'FIRH': '0148',
    'SP1M': '014A',
    'SP1A': '014C',
    'SP1V': '014E',
    'SP1B': '0150',
    'SP2M': '0152',
    'SP2A': '0154',
    'SP2V': '0156',
    'SP2B': '0158',
}
def sendFunction03(staNum, funCode, keyName):
    list1 = []
    list1.append(int('0x'+staNum, 16))
    list1.append(int('0x'+funCode, 16))
    list1.append(int('0x' + addressDict03[keyName][0:2], 16))
    list1.append(int('0x' + addressDict03[keyName][2:4], 16))
    list1.append(int('0x00', 16))
    list1.append(int('0x02', 16))
    crc16_func = crcmod.predefined.mkCrcFun('modbus')
    a = bytes().fromhex(staNum + funCode + addressDict03[keyName] + '0002')
    reslist = hex(crc16_func(a))[2:].zfill(4)
    print(type(reslist[2:].upper()), reslist[:2].upper())
    list1.append(int('0x' + reslist[2:], 16))
    list1.append(int('0x' + reslist[:2], 16))
    return list1

def sendFunction01(devAddress,funCode,keyName,cNum):
    list2=[]
    list2.append(int('0x'+devAddress, 16))
    list2.append(int('0x' + funCode, 16))
    list2.append(int('0x' + addressDict01[keyName][0:2], 16))
    list2.append(int('0x' + addressDict01[keyName][2:4], 16))
    list2.append(int('0x' + cNum[0:2], 16))
    list2.append(int('0x' + cNum[2:4], 16))
    crc16_func = crcmod.predefined.mkCrcFun('modbus')
    a = bytes().fromhex(devAddress + funCode + addressDict01[keyName] + cNum)
    reslist = hex(crc16_func(a))[2:].zfill(4)
    print(type(reslist[2:].upper()), reslist[:2].upper())
    list2.append(int('0x' + reslist[2:], 16))
    list2.append(int('0x' + reslist[:2], 16))
    return list2

def sendFunction05(staNum,funCode,keyName,zeroNum):
    list3 = []
    list3.append(int('0x' + staNum, 16))
    list3.append(int('0x' + funCode, 16))
    list3.append(int('0x' + addressDict05[keyName][0:2], 16))
    list3.append(int('0x' + addressDict05[keyName][2:4], 16))
    list3.append(int('0x' + zeroNum[0:2], 16))
    list3.append(int('0x' + zeroNum[2:4], 16))
    crc16_func = crcmod.predefined.mkCrcFun('modbus')
    a = bytes().fromhex(staNum + funCode + addressDict05[keyName] + zeroNum)
    reslist = hex(crc16_func(a))[2:].zfill(4)
    print(type(reslist[2:].upper()), reslist[:2].upper())
    list3.append(int('0x' + reslist[2:], 16))
    list3.append(int('0x' + reslist[:2], 16))
    return list3

def sendFunction10(staNum, funCode, keyName):
    list4 = []
    list4.append(int('0x'+staNum, 16))
    list4.append(int('0x'+funCode, 16))
    list4.append(int('0x' + addressDict03[keyName][0:2], 16))
    list4.append(int('0x' + addressDict03[keyName][2:4], 16))
    list4.append(int('0x00', 16))
    list4.append(int('0x02', 16))
    list4.append(int('0x04', 16))
    list4.append(int('0x00', 16))
    list4.append(int('0x00', 16))
    list4.append(int('0x00', 16))
    list4.append(int('0x00', 16))
    crc16_func = crcmod.predefined.mkCrcFun('modbus')
    a = bytes().fromhex(staNum + funCode + addressDict03[keyName] + '0002')
    reslist = hex(crc16_func(a))[2:].zfill(4)
    print(type(reslist[2:].upper()), reslist[:2].upper())
    list4.append(int('0x' + reslist[2:], 16))
    list4.append(int('0x' + reslist[:2], 16))
    return list4

def hex8ToInt(s):
    s = '{:032b}'.format(int(s,16))
    return int(s[1:], 2) - int(s[0]) * (1 << 31)


def intToHex8(i):
    return '{:08x}'.format(int((bin(((1 << 32) - 1) & i)[2:]).zfill(32), 2))

print(intToHex8(-1))
print(hex8ToInt('ffffffff'))

 

你可能感兴趣的:(挖个python坑)