# -*- coding: utf-8 -*-
import threading
# Form implementation generated from reading ui file 'CanOBD.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QThread, pyqtSignal,QTimer
from PyQt5.QtWidgets import QApplication, QTableWidget, QTableWidgetItem,QTreeWidget, QTreeWidgetItem
from SerialPro import SerialPort as SerialThread
from SerialPro import CanOBDItemList,CanPGNItemList
import time
import serial
import serial.tools.list_ports
import binascii
import struct
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1220, 940)
font = QtGui.QFont()
font.setPointSize(12)
MainWindow.setFont(font)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
self.tabWidget.setGeometry(QtCore.QRect(0, 0, 1041, 940))
self.tabWidget.setObjectName("tabWidget")
self.tab = QtWidgets.QWidget()
self.tab.setObjectName("tab")
self.tableWidget = QtWidgets.QTableWidget(self.tab)
self.tableWidget.setGeometry(QtCore.QRect(0, 0, 1031, 940))
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(5)
self.tableWidget.setRowCount(150)
for num in range(0,150,1):
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(num, item)
item = QtWidgets.QTableWidgetItem()
font = QtGui.QFont()
font.setKerning(False)
item.setFont(font)
for line in range(0,5,1):
self.tableWidget.setHorizontalHeaderItem(line, item)
item = QtWidgets.QTableWidgetItem()
self.tabWidget.addTab(self.tab, "")
self.tab_2 = QtWidgets.QWidget()
self.tab_2.setObjectName("CanOBD Cfg Set")
self.mSpeedTreeWidget = QtWidgets.QTreeWidget(self.tab_2)
self.mSpeedTreeWidget.setGeometry(QtCore.QRect(10, 0, 1031, 101))
self.mSpeedTreeWidget.setObjectName("mSpeedTreeWidget")
font = QtGui.QFont()
font.setPointSize(12)
self.mSpeedTreeWidget.headerItem().setFont(0, font)
self.mSpeedTreeWidget.headerItem().setTextAlignment(1, QtCore.Qt.AlignJustify|QtCore.Qt.AlignVCenter)
font = QtGui.QFont()
font.setKerning(True)
self.mSpeedTreeWidget.headerItem().setFont(3, font)
self.mRPMTreeWidget = QtWidgets.QTreeWidget(self.tab_2)
self.mRPMTreeWidget.setGeometry(QtCore.QRect(10, 100, 1031, 91))
self.mRPMTreeWidget.setObjectName("mRPMTreeWidget")
font = QtGui.QFont()
font.setPointSize(12)
self.mRPMTreeWidget.headerItem().setFont(0, font)
self.mRPMTreeWidget.headerItem().setTextAlignment(1, QtCore.Qt.AlignJustify|QtCore.Qt.AlignVCenter)
font = QtGui.QFont()
font.setKerning(True)
self.mRPMTreeWidget.headerItem().setFont(3, font)
self.mVDHRTreeWidget = QtWidgets.QTreeWidget(self.tab_2)
self.mVDHRTreeWidget.setGeometry(QtCore.QRect(10, 190, 1031, 91))
self.mVDHRTreeWidget.setObjectName("mVDHRTreeWidget")
font = QtGui.QFont()
font.setPointSize(12)
self.mVDHRTreeWidget.headerItem().setFont(0, font)
self.mVDHRTreeWidget.headerItem().setTextAlignment(1, QtCore.Qt.AlignJustify|QtCore.Qt.AlignVCenter)
font = QtGui.QFont()
font.setKerning(True)
self.mVDHRTreeWidget.headerItem().setFont(3, font)
self.mHoursTreeWidget = QtWidgets.QTreeWidget(self.tab_2)
self.mHoursTreeWidget.setGeometry(QtCore.QRect(10, 280, 1031, 101))
self.mHoursTreeWidget.setObjectName("mHoursTreeWidget")
font = QtGui.QFont()
font.setPointSize(12)
self.mHoursTreeWidget.headerItem().setFont(0, font)
self.mHoursTreeWidget.headerItem().setTextAlignment(1, QtCore.Qt.AlignJustify|QtCore.Qt.AlignVCenter)
font = QtGui.QFont()
font.setKerning(True)
self.mHoursTreeWidget.headerItem().setFont(3, font)
self.mEECTreeWidget = QtWidgets.QTreeWidget(self.tab_2)
self.mEECTreeWidget.setGeometry(QtCore.QRect(10, 380, 1031, 91))
self.mEECTreeWidget.setObjectName("mEECTreeWidget")
font = QtGui.QFont()
font.setPointSize(12)
self.mEECTreeWidget.headerItem().setFont(0, font)
self.mEECTreeWidget.headerItem().setTextAlignment(1, QtCore.Qt.AlignJustify|QtCore.Qt.AlignVCenter)
font = QtGui.QFont()
font.setKerning(True)
self.mEECTreeWidget.headerItem().setFont(3, font)
self.mET1TreeWidget = QtWidgets.QTreeWidget(self.tab_2)
self.mET1TreeWidget.setGeometry(QtCore.QRect(10, 470, 1031, 101))
self.mET1TreeWidget.setObjectName("mET1TreeWidget")
font = QtGui.QFont()
font.setPointSize(12)
self.mET1TreeWidget.headerItem().setFont(0, font)
self.mET1TreeWidget.headerItem().setTextAlignment(1, QtCore.Qt.AlignJustify|QtCore.Qt.AlignVCenter)
font = QtGui.QFont()
font.setKerning(True)
self.mET1TreeWidget.headerItem().setFont(3, font)
self.mAT1T1ITreeWidget = QtWidgets.QTreeWidget(self.tab_2)
self.mAT1T1ITreeWidget.setGeometry(QtCore.QRect(10, 570, 1031, 91))
self.mAT1T1ITreeWidget.setObjectName("mAT1T1ITreeWidget")
font = QtGui.QFont()
font.setPointSize(12)
self.mAT1T1ITreeWidget.headerItem().setFont(0, font)
self.mAT1T1ITreeWidget.headerItem().setTextAlignment(1, QtCore.Qt.AlignJustify|QtCore.Qt.AlignVCenter)
font = QtGui.QFont()
font.setKerning(True)
self.mAT1T1ITreeWidget.headerItem().setFont(3, font)
self.mLFETreeWidget = QtWidgets.QTreeWidget(self.tab_2)
self.mLFETreeWidget.setGeometry(QtCore.QRect(10, 660, 1031, 101))
self.mLFETreeWidget.setObjectName("mLFETreeWidget")
font = QtGui.QFont()
font.setPointSize(12)
self.mLFETreeWidget.headerItem().setFont(0, font)
self.mLFETreeWidget.headerItem().setTextAlignment(1, QtCore.Qt.AlignJustify|QtCore.Qt.AlignVCenter)
font = QtGui.QFont()
font.setKerning(True)
self.mLFETreeWidget.headerItem().setFont(3, font)
self.mETC2TreeWidget = QtWidgets.QTreeWidget(self.tab_2)
self.mETC2TreeWidget.setGeometry(QtCore.QRect(10, 760, 1031, 101))
self.mETC2TreeWidget.setObjectName("mETC2TreeWidget")
font = QtGui.QFont()
font.setPointSize(12)
self.mETC2TreeWidget.headerItem().setFont(0, font)
self.mETC2TreeWidget.headerItem().setTextAlignment(1, QtCore.Qt.AlignJustify|QtCore.Qt.AlignVCenter)
font = QtGui.QFont()
font.setKerning(True)
self.mETC2TreeWidget.headerItem().setFont(3, font)
self.tabWidget.addTab(self.tab_2, "")
self.mComCfgBox = QtWidgets.QGroupBox(self.centralwidget)
self.mComCfgBox.setGeometry(QtCore.QRect(1040, 10, 191, 231))
font = QtGui.QFont()
font.setPointSize(14)
font.setBold(True)
font.setWeight(75)
self.mComCfgBox.setFont(font)
self.mComCfgBox.setObjectName("mComCfgBox")
self.mPortName = QtWidgets.QLabel(self.mComCfgBox)
self.mPortName.setGeometry(QtCore.QRect(20, 30, 61, 21))
self.mPortName.setObjectName("mPortName")
self.mBpsName = QtWidgets.QLabel(self.mComCfgBox)
self.mBpsName.setGeometry(QtCore.QRect(20, 60, 61, 21))
self.mBpsName.setObjectName("mBpsName")
self.mDatabitName = QtWidgets.QLabel(self.mComCfgBox)
self.mDatabitName.setGeometry(QtCore.QRect(20, 90, 61, 21))
self.mDatabitName.setObjectName("mDatabitName")
self.mStopName = QtWidgets.QLabel(self.mComCfgBox)
self.mStopName.setGeometry(QtCore.QRect(20, 120, 61, 21))
self.mStopName.setObjectName("mStopName")
self.mOddName = QtWidgets.QLabel(self.mComCfgBox)
self.mOddName.setGeometry(QtCore.QRect(20, 150, 61, 21))
self.mOddName.setObjectName("mOddName")
self.mDatabitVal = QtWidgets.QLabel(self.mComCfgBox)
self.mDatabitVal.setGeometry(QtCore.QRect(100, 90, 54, 21))
font = QtGui.QFont()
font.setPointSize(14)
font.setBold(True)
font.setWeight(75)
self.mDatabitVal.setFont(font)
self.mDatabitVal.setLayoutDirection(QtCore.Qt.LeftToRight)
self.mDatabitVal.setAlignment(QtCore.Qt.AlignCenter)
self.mDatabitVal.setObjectName("mDatabitVal")
self.mStopBitVal = QtWidgets.QLabel(self.mComCfgBox)
self.mStopBitVal.setGeometry(QtCore.QRect(100, 120, 54, 21))
font = QtGui.QFont()
font.setPointSize(14)
font.setBold(True)
font.setWeight(75)
self.mStopBitVal.setFont(font)
self.mStopBitVal.setLayoutDirection(QtCore.Qt.LeftToRight)
self.mStopBitVal.setAlignment(QtCore.Qt.AlignCenter)
self.mStopBitVal.setObjectName("mStopBitVal")
self.mOddVal = QtWidgets.QLabel(self.mComCfgBox)
self.mOddVal.setGeometry(QtCore.QRect(100, 150, 54, 21))
font = QtGui.QFont()
font.setPointSize(14)
font.setBold(True)
font.setWeight(75)
self.mOddVal.setFont(font)
self.mOddVal.setLayoutDirection(QtCore.Qt.LeftToRight)
self.mOddVal.setAlignment(QtCore.Qt.AlignCenter)
self.mOddVal.setObjectName("mOddVal")
self.mPortVal = QtWidgets.QComboBox(self.mComCfgBox)
self.mPortVal.setGeometry(QtCore.QRect(90, 30, 81, 22))
self.mPortVal.setObjectName("mPortVal")
self.mPortVal.addItem("")
self.mPortVal.addItem("")
self.mPortVal.addItem("")
self.mPortVal.addItem("")
self.mPortVal.addItem("")
self.mPortVal.addItem("")
self.mBPSVal = QtWidgets.QComboBox(self.mComCfgBox)
self.mBPSVal.setGeometry(QtCore.QRect(90, 60, 81, 22))
self.mBPSVal.setObjectName("mBPSVal")
self.mBPSVal.addItem("")
self.mBPSVal.addItem("")
self.mBPSVal.addItem("")
self.mBPSVal.addItem("")
self.mBPSVal.addItem("")
self.mBPSVal.addItem("")
self.mOpenSerial = QtWidgets.QDialogButtonBox(self.mComCfgBox)
self.mOpenSerial.setGeometry(QtCore.QRect(20, 190, 156, 31))
self.mOpenSerial.setStandardButtons(QtWidgets.QDialogButtonBox.Close|QtWidgets.QDialogButtonBox.Open)
self.mOpenSerial.setObjectName("mOpenSerial")
self.mCycleCfgBox = QtWidgets.QGroupBox(self.centralwidget)
self.mCycleCfgBox.setGeometry(QtCore.QRect(1040, 260, 191, 221))
font = QtGui.QFont()
font.setPointSize(14)
font.setBold(True)
font.setWeight(75)
self.mCycleCfgBox.setFont(font)
self.mCycleCfgBox.setObjectName("mCycleCfgBox")
self.mcheck1000ms = QtWidgets.QCheckBox(self.mCycleCfgBox)
self.mcheck1000ms.setGeometry(QtCore.QRect(20, 180, 141, 31))
self.mcheck1000ms.setObjectName("mcheck1000ms")
self.mcheck500ms = QtWidgets.QCheckBox(self.mCycleCfgBox)
self.mcheck500ms.setGeometry(QtCore.QRect(20, 150, 141, 31))
self.mcheck500ms.setObjectName("mcheck500ms")
self.mcheck100ms = QtWidgets.QCheckBox(self.mCycleCfgBox)
self.mcheck100ms.setGeometry(QtCore.QRect(20, 90, 141, 31))
self.mcheck100ms.setObjectName("mcheck100ms")
self.mcheck50ms = QtWidgets.QCheckBox(self.mCycleCfgBox)
self.mcheck50ms.setGeometry(QtCore.QRect(20, 60, 141, 31))
self.mcheck50ms.setObjectName("mcheck50ms")
self.mcheck20ms = QtWidgets.QCheckBox(self.mCycleCfgBox)
self.mcheck20ms.setGeometry(QtCore.QRect(20, 30, 141, 31))
self.mcheck20ms.setObjectName("mcheck20ms")
self.mcheck200ms = QtWidgets.QCheckBox(self.mCycleCfgBox)
self.mcheck200ms.setGeometry(QtCore.QRect(20, 120, 141, 31))
self.mcheck200ms.setObjectName("mcheck200ms")
self.mEventSigBox = QtWidgets.QGroupBox(self.centralwidget)
self.mEventSigBox.setGeometry(QtCore.QRect(1050, 490, 191, 151))
font = QtGui.QFont()
font.setPointSize(14)
font.setBold(True)
font.setWeight(75)
self.mEventSigBox.setFont(font)
self.mEventSigBox.setObjectName("mEventSigBox")
self.radioLeftREvent = QtWidgets.QRadioButton(self.mEventSigBox)
self.radioLeftREvent.setGeometry(QtCore.QRect(10, 30, 151, 16))
self.radioLeftREvent.setObjectName("radioLeftREvent")
self.radioKiilEvent = QtWidgets.QRadioButton(self.mEventSigBox)
self.radioKiilEvent.setGeometry(QtCore.QRect(10, 90, 151, 16))
self.radioKiilEvent.setObjectName("radioKiilEvent")
self.radioPEvent = QtWidgets.QRadioButton(self.mEventSigBox)
self.radioPEvent.setGeometry(QtCore.QRect(10, 120, 151, 16))
self.radioPEvent.setObjectName("radioPEvent")
self.radioOpenCloseEvent = QtWidgets.QRadioButton(self.mEventSigBox)
self.radioOpenCloseEvent.setGeometry(QtCore.QRect(10, 60, 151, 16))
self.radioOpenCloseEvent.setObjectName("radioOpenCloseEvent")
self.mReadOBDinfBox = QtWidgets.QGroupBox(self.centralwidget)
self.mReadOBDinfBox.setGeometry(QtCore.QRect(1050, 660, 191, 171))
font = QtGui.QFont()
font.setPointSize(14)
font.setBold(True)
font.setWeight(75)
self.mReadOBDinfBox.setFont(font)
self.mReadOBDinfBox.setObjectName("mReadOBDinfBox")
self.radioVinRead = QtWidgets.QRadioButton(self.mReadOBDinfBox)
self.radioVinRead.setGeometry(QtCore.QRect(10, 40, 141, 21))
self.radioVinRead.setObjectName("radioVinRead")
self.mVinInfShow = QtWidgets.QTextBrowser(self.mReadOBDinfBox)
self.mVinInfShow.setGeometry(QtCore.QRect(10, 70, 171, 91))
self.mVinInfShow.setObjectName("mVinInfShow")
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
self.tabWidget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
for num in range(0, 150, 1):
item = self.tableWidget.verticalHeaderItem(num)
item.setText(_translate("MainWindow", str(num +1)))
item = self.tableWidget.horizontalHeaderItem(0)
item.setText(_translate("MainWindow", "时间标识"))
item = self.tableWidget.horizontalHeaderItem(1)
item.setText(_translate("MainWindow", "帧ID"))
item = self.tableWidget.horizontalHeaderItem(2)
item.setText(_translate("MainWindow", "帧类型"))
item = self.tableWidget.horizontalHeaderItem(3)
item.setText(_translate("MainWindow", "长度"))
item = self.tableWidget.horizontalHeaderItem(4)
item.setText(_translate("MainWindow", "数据 (BIT7--BIT0 大端模式)"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Tab 1"))
self.mSpeedTreeWidget.headerItem().setText(0, _translate("MainWindow", "速度[CCVS1]"))
self.mSpeedTreeWidget.headerItem().setText(1, _translate("MainWindow", "CanID"))
self.mSpeedTreeWidget.headerItem().setText(2, _translate("MainWindow", "Data"))
self.mSpeedTreeWidget.headerItem().setText(3, _translate("MainWindow", "Signal(km/h)"))
self.mSpeedTreeWidget.setColumnWidth(0, 150)
self.mSpeedTreeWidget.setColumnWidth(1, 150)
self.mSpeedTreeWidget.setColumnWidth(2, 550)
self.mSpeedTreeWidget.setColumnWidth(3, 150)
self.mRPMTreeWidget.headerItem().setText(0, _translate("MainWindow", "转速[EEC1]"))
self.mRPMTreeWidget.headerItem().setText(1, _translate("MainWindow", "CanID"))
self.mRPMTreeWidget.headerItem().setText(2, _translate("MainWindow", "Data"))
self.mRPMTreeWidget.headerItem().setText(3, _translate("MainWindow", "Signal(rpm)"))
self.mRPMTreeWidget.setColumnWidth(0, 150)
self.mRPMTreeWidget.setColumnWidth(1, 150)
self.mRPMTreeWidget.setColumnWidth(2, 550)
self.mRPMTreeWidget.setColumnWidth(3, 150)
self.mVDHRTreeWidget.headerItem().setText(0, _translate("MainWindow", "里程[VDHR]"))
self.mVDHRTreeWidget.headerItem().setText(1, _translate("MainWindow", "CanID"))
self.mVDHRTreeWidget.headerItem().setText(2, _translate("MainWindow", "Data"))
self.mVDHRTreeWidget.headerItem().setText(3, _translate("MainWindow", "Signal(km)"))
self.mVDHRTreeWidget.setColumnWidth(0, 150)
self.mVDHRTreeWidget.setColumnWidth(1, 150)
self.mVDHRTreeWidget.setColumnWidth(2, 550)
self.mVDHRTreeWidget.setColumnWidth(3, 150)
self.mHoursTreeWidget.headerItem().setText(0, _translate("MainWindow", "工作时长[HOURS]"))
self.mHoursTreeWidget.headerItem().setText(1, _translate("MainWindow", "CanID"))
self.mHoursTreeWidget.headerItem().setText(2, _translate("MainWindow", "Data"))
self.mHoursTreeWidget.headerItem().setText(3, _translate("MainWindow", "Signal(hours)"))
self.mHoursTreeWidget.setColumnWidth(0, 150)
self.mHoursTreeWidget.setColumnWidth(1, 150)
self.mHoursTreeWidget.setColumnWidth(2, 550)
self.mHoursTreeWidget.setColumnWidth(3, 150)
self.mEECTreeWidget.headerItem().setText(0, _translate("MainWindow", "发动机负载[EEC1]"))
self.mEECTreeWidget.headerItem().setText(1, _translate("MainWindow", "CanID"))
self.mEECTreeWidget.headerItem().setText(2, _translate("MainWindow", "Data"))
self.mEECTreeWidget.headerItem().setText(3, _translate("MainWindow", "Signal(%)"))
self.mEECTreeWidget.setColumnWidth(0, 150)
self.mEECTreeWidget.setColumnWidth(1, 150)
self.mEECTreeWidget.setColumnWidth(2, 550)
self.mEECTreeWidget.setColumnWidth(3, 150)
self.mET1TreeWidget.headerItem().setText(0, _translate("MainWindow", "冷却液温度[ET1]"))
self.mET1TreeWidget.headerItem().setText(1, _translate("MainWindow", "CanID"))
self.mET1TreeWidget.headerItem().setText(2, _translate("MainWindow", "Data"))
self.mET1TreeWidget.headerItem().setText(3, _translate("MainWindow", "Signal(°)"))
self.mET1TreeWidget.setColumnWidth(0, 150)
self.mET1TreeWidget.setColumnWidth(1, 150)
self.mET1TreeWidget.setColumnWidth(2, 550)
self.mET1TreeWidget.setColumnWidth(3, 150)
self.mAT1T1ITreeWidget.headerItem().setText(0, _translate("MainWindow", "燃油液面[AT1T1I]"))
self.mAT1T1ITreeWidget.headerItem().setText(1, _translate("MainWindow", "CanID"))
self.mAT1T1ITreeWidget.headerItem().setText(2, _translate("MainWindow", "Data"))
self.mAT1T1ITreeWidget.headerItem().setText(3, _translate("MainWindow", "Signal(%)"))
self.mAT1T1ITreeWidget.setColumnWidth(0, 150)
self.mAT1T1ITreeWidget.setColumnWidth(1, 150)
self.mAT1T1ITreeWidget.setColumnWidth(2, 550)
self.mAT1T1ITreeWidget.setColumnWidth(3, 150)
self.mLFETreeWidget.headerItem().setText(0, _translate("MainWindow", "平均油耗[LFE]"))
self.mLFETreeWidget.headerItem().setText(1, _translate("MainWindow", "CanID"))
self.mLFETreeWidget.headerItem().setText(2, _translate("MainWindow", "Data"))
self.mLFETreeWidget.headerItem().setText(3, _translate("MainWindow", "Signal(L/h)"))
self.mLFETreeWidget.setColumnWidth(0, 150)
self.mLFETreeWidget.setColumnWidth(1, 150)
self.mLFETreeWidget.setColumnWidth(2, 550)
self.mLFETreeWidget.setColumnWidth(3, 150)
self.mETC2TreeWidget.headerItem().setText(0, _translate("MainWindow", "档位[ETC2]"))
self.mETC2TreeWidget.headerItem().setText(1, _translate("MainWindow", "CanID"))
self.mETC2TreeWidget.headerItem().setText(2, _translate("MainWindow", "Data"))
self.mETC2TreeWidget.headerItem().setText(3, _translate("MainWindow", "Signal"))
self.mETC2TreeWidget.setColumnWidth(0, 150)
self.mETC2TreeWidget.setColumnWidth(1, 150)
self.mETC2TreeWidget.setColumnWidth(2, 550)
self.mETC2TreeWidget.setColumnWidth(3, 150)
self.tableWidget.setColumnWidth(0, 200)
self.tableWidget.setColumnWidth(1, 150)
self.tableWidget.setColumnWidth(4,450)
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "CanOBD Inf Show"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "CanOBD J1939 Show"))
self.mComCfgBox.setTitle(_translate("MainWindow", "串口配置"))
self.mPortName.setText(_translate("MainWindow", "端口号"))
self.mBpsName.setText(_translate("MainWindow", "波特率"))
self.mDatabitName.setText(_translate("MainWindow", "数据位"))
self.mStopName.setText(_translate("MainWindow", "停止位"))
self.mOddName.setText(_translate("MainWindow", "检验位"))
self.mDatabitVal.setText(_translate("MainWindow", "8"))
self.mStopBitVal.setText(_translate("MainWindow", "1"))
self.mOddVal.setText(_translate("MainWindow", "无"))
self.mBPSVal.setItemText(0, _translate("MainWindow", "9600"))
self.mBPSVal.setItemText(1, _translate("MainWindow", "19200"))
self.mBPSVal.setItemText(2, _translate("MainWindow", "115200"))
self.mBPSVal.setItemText(3, _translate("MainWindow", "230400"))
self.mBPSVal.setItemText(4, _translate("MainWindow", "256000"))
self.mBPSVal.setItemText(5, _translate("MainWindow", "460800"))
port_list = list(serial.tools.list_ports.comports())
if port_list.__len__() is not 0:
for num in range(port_list.__len__()):
self.mPortVal.setItemText(num, _translate("MainWindow", str(port_list[num].device)))
serialport = self.mPortVal.currentText()
serialbaudrate = self.mBPSVal.currentText()
self.LSerial = SerialThread(serialport, serialbaudrate)
self.mCycleCfgBox.setTitle(_translate("MainWindow", "过滤设置(周期)"))
self.mcheck1000ms.setText(_translate("MainWindow", "1000ms 周期"))
self.mcheck500ms.setText(_translate("MainWindow", "500ms 周期"))
self.mcheck100ms.setText(_translate("MainWindow", "100ms 周期"))
self.mcheck50ms.setText(_translate("MainWindow", "50ms 周期"))
self.mcheck20ms.setText(_translate("MainWindow", "20ms 周期"))
self.mcheck200ms.setText(_translate("MainWindow", "200ms 周期"))
self.mEventSigBox.setTitle(_translate("MainWindow", "事件信号策略"))
self.radioLeftREvent.setText(_translate("MainWindow", "左右转 事件"))
self.radioKiilEvent.setText(_translate("MainWindow", "刹车 事件"))
self.radioPEvent.setText(_translate("MainWindow", "档位 事件"))
self.radioOpenCloseEvent.setText(_translate("MainWindow", "开关门 事件"))
self.mReadOBDinfBox.setTitle(_translate("MainWindow", "主动读取信息"))
self.radioVinRead.setText(_translate("MainWindow", "VIN 信息"))
def OpenSerial(self):
if self.LSerial != None:
if self.LSerial.SerialIsOpen():
self.LSerial.__del__()
port_list = list(serial.tools.list_ports.comports())
if port_list.__len__() != 0:
serialport = self.mPortVal.currentText()
serialbaudrate = self.mBPSVal.currentText()
self.LSerial.__init__(serialport,serialbaudrate)
# 开启线程
self.thread = Worker() # 创建线程对象
self.thread.update_signal.connect(self.CanOBDdatarefresh) # 连接信号和槽
self.thread.update_signal.connect(self.CanOBDSignalAnalyPro) # 连接信号和槽
# self.thread.update_signal.connect(self.LSerial.Com_read_frame) # 连接信号和槽
self.thread.start() # 启动线程
#self.LSerial.Com_read_frame()
self.LSerial.start_reading() # <-- 在这里启动读取线程
def CloseSerial(self):
if self.LSerial.SerialIsOpen():
self.LSerial.close()
def Serialconnectslot(self):
self.mOpenSerial.accepted.connect(self.OpenSerial)
self.mOpenSerial.rejected.connect(self.CloseSerial)
def get_checked_cycles(self):
"""返回用户勾选的所有周期值(毫秒)"""
checked_cycles = []
if self.mcheck20ms.isChecked():
checked_cycles.append(10)
if self.mcheck50ms.isChecked():
checked_cycles.append(50)
if self.mcheck100ms.isChecked():
checked_cycles.append(100)
if self.mcheck200ms.isChecked():
checked_cycles.append(200)
if self.mcheck500ms.isChecked():
checked_cycles.append(500)
if self.mcheck1000ms.isChecked():
checked_cycles.append(1000)
return checked_cycles
def CanOBDdatarefresh(self):
# # 检查数据接收是否超时(1秒阈值)
# current_time = time.time()
# if current_time - self.LSerial.last_data_time > 1.0:
# # 清空缓冲区并跳过刷新
# global frame_buffer
# frame_buffer = bytearray()
# return
filtered_cycles = self.get_checked_cycles()
all_update_ids = self.LSerial.data_updated_ids | self.LSerial.new_added_ids
for can_id in all_update_ids:
# 查找该ID在列表中的位置
row_index = None
for idx, item in enumerate(CanOBDItemList):
if item[1] == can_id:
row_index = idx
break
if row_index is None or row_index >= self.tableWidget.rowCount():
continue
# 周期过滤检查
if can_id in self.LSerial.cycle_dict:
cycle = self.LSerial.cycle_dict[can_id]
skip = False
for filtered_cycle in filtered_cycles:
tolerance = filtered_cycle * 0.1
if abs(cycle - filtered_cycle) <= tolerance:
skip = True
break
if skip:
continue
# 更新表格行
item_data = CanOBDItemList[row_index]
self.tableWidget.setItem(row_index, 0, QtWidgets.QTableWidgetItem(str(item_data[0])))
self.tableWidget.setItem(row_index, 1, QtWidgets.QTableWidgetItem(str(item_data[1])))
self.tableWidget.setItem(row_index, 2, QtWidgets.QTableWidgetItem(str(item_data[2])))
self.tableWidget.setItem(row_index, 3, QtWidgets.QTableWidgetItem(str(item_data[3])))
self.tableWidget.setItem(row_index, 4, QtWidgets.QTableWidgetItem(str(item_data[4])))
# 清空标志位
self.LSerial.data_updated_ids.clear()
self.LSerial.new_added_ids.clear()
self.tableWidget.show()
def CanOBDSignalAnalyPro(self):
index = 0
bfindflag = 0
if all(not sublist for sublist in CanPGNItemList) or CanPGNItemList[0][0] == 0:
if len(CanPGNItemList):
CanPGNItemList.pop(0)
else:
for signalindex in CanPGNItemList:
value = ''.join(c for c in signalindex[0].lower() if c in '0123456789abcdef')
# 判断是否需要补零(前面补)
if len(value) % 2 != 0:
value = '0' + value
# 将处理后的字符串重新赋值给 signalindex[0]
signalindex[0] = value
PGNCanID = bytes.fromhex(str(signalindex[0])).hex()
#PGNCanID = int(signalindex[0])
#车速
if (PGNCanID == bytes.fromhex("FEF1").hex()):
num_top_items = self.mSpeedTreeWidget.topLevelItemCount()
for index in range(num_top_items ):
if (self.mSpeedTreeWidget.topLevelItem(index).text(1) == str(signalindex[1])):
self.mSpeedTreeWidget.topLevelItem(index).setText(0, str(signalindex[0]))
self.mSpeedTreeWidget.topLevelItem(index).setText(1, str(signalindex[1]))
self.mSpeedTreeWidget.topLevelItem(index).setText(2, str(signalindex[2]))
self.mSpeedTreeWidget.topLevelItem(index).setText(3, str(signalindex[3]))
bfindflag = 1
break
#self.mSpeedTreeWidget.addTopLevelItem(speeditem)
if bfindflag == 0:
speeditem = QTreeWidgetItem(self.mSpeedTreeWidget)
speeditem.setText(0, str(signalindex[0]))
speeditem.setText(1, str(signalindex[1]))
speeditem.setText(2, str(signalindex[2]))
speeditem.setText(3, str(signalindex[3]))
self.mSpeedTreeWidget.addTopLevelItem(speeditem)
self.mSpeedTreeWidget.expandAll()
self.mSpeedTreeWidget.show()
class Worker(QThread):
update_signal = pyqtSignal(int) # 定义一个信号,用于传递更新信息到主线程
def run(self):
# 模拟耗时操作
while True:
time.sleep(0.1)
self.update_signal.emit(1) # 发射信号,传递更新信息
这是程序的主要部分代码,已经填写了tab2的第一行,现在需要填写其他行的数据,根据填写第一行的代码,完善代码,以下是各类数据的信息表格供你参考,最后一列是对应数据的位置(1-8)
速度 CCVS1 0x00FEF1xx 2-3
发动机转速 EEC1 0x00F004x 4-5
里程表 VDHR 0x00FEC1xx 1-4
发动机工作小时数 HOURS 0x00FEE5xx 1-4
平均油耗 LFE 0x00FEF2xx 1-2
冷却液温度 ET1 0x00FEEExx 1
发动机负载 EEC1 0x00F004xx 3
机油压力 EFL/P1 0x00FEEFxx 4
燃油液位(L) AT1T1I 0x00FE56xx 1
发动机进气流量 EGF1 0x00F00Axx 3-4
油门踏板位置 EEC2 0x00F003xx 2
档位(D/R/N/P) ETC2 0x00F005xx 4
制动器 EBC1 0x00F001xx 2
最新发布