- self.setGeometry(400, 200, 800, 660)  # 位置和大小
 
-         self.setMinimumSize(QtCore.QSize(self.app_w, self.app_h))
 
-         self.setMaximumSize(QtCore.QSize(self.app_w, self.app_h))
 
-         ports = serial.tools.list_ports.comports()
 
 
-         #### Create Gui Elements ###########
 
-         self.mainbox = QtWidgets.QWidget()
 
-         self.setCentralWidget(self.mainbox)
 
-         self.mainbox.setLayout(QtWidgets.QVBoxLayout())
 
 
-         self.combex = QtWidgets.QComboBox(self.mainbox)
 
-         for port, desc, hwid in sorted(ports):
 
-             self.combex.addItem(port)
 
-         self.ser =serial.Serial()
 
-         self.ser.close()
 
-         self.combex.setGeometry(10, 0, 100, 20)
 
-         
 
-         self.baud = QtWidgets.QComboBox(self.mainbox)
 
-         self.baud.setGeometry(120, 0, 100, 20)
 
-         baud = [9600,19200,38400,57600,115200,230400,460800,921600]
 
-         for i in baud:
 
-             self.baud.addItem(str(i))
 
-         self.baud.setCurrentIndex(4)
 
-         
 
-         self.open = QtWidgets.QPushButton("打开串口",self.mainbox)
 
-         self.open.clicked.connect(self.open_serial)
 
-         self.open.setGeometry(230, 0, 100, 20)
 
-         
 
-         self.check1 = QtWidgets.QCheckBox("曲线1",self.mainbox)
 
-         self.check1.setGeometry(340, 0, 50, 20)
 
-         self.check1.setStyleSheet("background-color: yellow;")
 
-         self.check1.setChecked(True)
 
-         self.check1.stateChanged.connect(self.on_checkbox_state_changed)  # 连接信号与槽函数
 
 
-         self.check2 = QtWidgets.QCheckBox("曲线2",self.mainbox)
 
-         self.check2.setGeometry(400, 0, 50, 20)
 
-         self.check2.setStyleSheet("background-color: red;")
 
-         self.check2.setChecked(True)
 
-         self.check2.stateChanged.connect(self.on_checkbox_state_changed)  # 连接信号与槽函数
 
-         
 
-         self.check3 = QtWidgets.QCheckBox("曲线3",self.mainbox)
 
-         self.check3.setGeometry(460, 0, 50, 20)
 
-         self.check3.setStyleSheet("background-color: green;")
 
-         self.check3.setChecked(True)
 
-         self.check3.stateChanged.connect(self.on_checkbox_state_changed)  # 连接信号与槽函数
 
-         
 
-         self.check4 = QtWidgets.QCheckBox("曲线4",self.mainbox)
 
-         self.check4.setGeometry(520, 0, 50, 20)
 
-         self.check4.setStyleSheet("background-color: blue;")
 
-         self.check4.setChecked(True)
 
-         self.check4.stateChanged.connect(self.on_checkbox_state_changed)  # 连接信号与槽函数
 
 
-         self.label = QtWidgets.QLabel("协议示例:   printf("<plots,%d,%d,%d,%d>",p1,p2,p3,p4);   ",self.mainbox)
 
-         self.label.setGeometry(10, 30, 400, 20)
 
 
-         self.canvas = pg.GraphicsLayoutWidget(self.mainbox)
 
-         self.canvas.setGeometry(0, 60, 800, 600)  # 设置位置和大小
设置曲线最大100个数据宽度,设置4个曲线颜色
 
-         # Line plot
 
-         self.cpuplot = self.canvas.addPlot(title=" ", axisItems={'bottom': TimeAxisItem(orientation='bottom')})
 
-         self.p1 = self.cpuplot.plot(pen='y')
 
-         self.p2 = self.cpuplot.plot(pen='r')
 
-         self.p3 = self.cpuplot.plot(pen='g')
 
-         self.p4 = self.cpuplot.plot(pen='b')
打开串口并创建dataUpdate_thead线程,该线程为串口协议处理
- def open_serial(self):
 
-         #self.p1.setVisible(not self.p1.isVisible())
 
-         if self.ser.is_open == True:
 
-             self.ser.close()
 
-             self.open.setText('打开串口')
 
-             self.combex.setEnabled(True)
 
-             self.baud.setEnabled(True)
 
-         else:
 
-             print(self.combex.currentText())
 
-             self.ser = serial.Serial(self.combex.currentText(), int(self.baud.currentText()))
 
-             if(self.ser.is_open == True):
 
-                 self.open.setText('关闭串口')
 
-                 self.combex.setEnabled(False)
 
-                 self.baud.setEnabled(False)
 
-                 self.stop = 0
 
-                 self.t = threading.Thread(target=dataUpdate_thead, args=(self,))
 
-                 self.t.daemon = True
 
-                 self.t.start()  # 线程执行
协议使用的字符串形式, printf(\"<plots,%d,%d,%d,%d>\",p1,p2,p3,p4); 以此作为协议处理;
判定起始数据<,开始接收字符,未开始,则字符丢弃;判定>为结束字符,结束后开始处理内容;
将字符串通过“,”字符进行split,得到5个字符串,1个固定字符和4个数据;
判定字符串长度和校验固定字符,校验完成后将4个数据放入曲线buffer内,设置到曲线内即可;
- def dataUpdate_thead(self):
 
-     start = 0
 
-     strs = ''
 
-     process= []
 
-     while True:  # 为了方便测试,让数据不停的更新
 
-         if self.stop == 1 or self.ser.isOpen() == False:
 
-             return 
 
-         data = self.ser.read().decode()
 
-         if data == '<':
 
-             start = 1
 
-             strs = ""
 
-         elif data == '>':
 
-             start = 0
 
-             split_list = strs.split(',')
 
-             process.clear()
 
-             for base in split_list:
 
-                 process.append( base.strip())
 
-                 
 
-             strs = ""
 
-             if len(process) == 5 and process[0] == "plots"  :
 
-                 current_time = int(time.time() * 1000)
 
-                 y1, y2, y3, y4 = map(int, [element.strip() for element in process[1:5]])
 
 
-                 self.X.append(current_time)
 
-                 self.Y.append(y1)
 
-                 self.Y2.append(y2)
 
-                 self.Y3.append(y3)
 
-                 self.Y4.append(y4)
 
-                 # 只在需要绘制时转换为数组
 
-                 self.xdata = np.array(self.X)
 
-                 self.ydata = np.array(self.Y)
 
-                 self.ydata2 = np.array(self.Y2)
 
-                 self.ydata3 = np.array(self.Y3)
 
-                 self.ydata4 = np.array(self.Y4)
 
-                 self.p1.setData(self.xdata, self.ydata)
 
-                 self.p2.setData(self.xdata, self.ydata2)
 
-                 self.p3.setData(self.xdata, self.ydata3)
 
-                 self.p4.setData(self.xdata, self.ydata4)
 
-               <blockquote>
 
以下是完成后的界面;自适应范围