練手項目,先上圖

先實現一個簡單的串口工具,為之后的上位機做準備
代碼如下:
github 下載地址
pyserial_demo.py
import sysimport serialimport serial.tools.list_portsfrom PyQt5 import QtWidgetsfrom PyQt5.QtWidgets import QMessageBoxfrom PyQt5.QtCore import QTimerfrom ui_demo_1 import Ui_Formclass Pyqt5_Serial(QtWidgets.QWidget, Ui_Form): def __init__(self): super(Pyqt5_Serial, self).__init__() self.setupUi(self) self.init() self.setWindowTitle("串口小助手") self.ser = serial.Serial() self.port_check() # 接收數據和發送數據數目置零 self.data_num_received = 0 self.lineEdit.setText(str(self.data_num_received)) self.data_num_sended = 0 self.lineEdit_2.setText(str(self.data_num_sended)) def init(self): # 串口檢測按鈕 self.s1__box_1.clicked.connect(self.port_check) # 串口信息顯示 self.s1__box_2.currentTextChanged.connect(self.port_imf) # 打開串口按鈕 self.open_button.clicked.connect(self.port_open) # 關閉串口按鈕 self.close_button.clicked.connect(self.port_close) # 發送數據按鈕 self.s3__send_button.clicked.connect(self.data_send) # 定時發送數據 self.timer_send = QTimer() self.timer_send.timeout.connect(self.data_send) self.timer_send_cb.stateChanged.connect(self.data_send_timer) # 定時器接收數據 self.timer = QTimer(self) self.timer.timeout.connect(self.data_receive) # 清除發送窗口 self.s3__clear_button.clicked.connect(self.send_data_clear) # 清除接收窗口 self.s2__clear_button.clicked.connect(self.receive_data_clear) # 串口檢測 def port_check(self): # 檢測所有存在的串口,將信息存儲在字典中 self.Com_Dict = {} port_list = list(serial.tools.list_ports.comports()) self.s1__box_2.clear() for port in port_list: self.Com_Dict["%s" % port[0]] = "%s" % port[1] self.s1__box_2.addItem(port[0]) if len(self.Com_Dict) == 0: self.state_label.setText(" 無串口") # 串口信息 def port_imf(self): # 顯示選定的串口的詳細信息 imf_s = self.s1__box_2.currentText() if imf_s != "": self.state_label.setText(self.Com_Dict[self.s1__box_2.currentText()]) # 打開串口 def port_open(self): self.ser.port = self.s1__box_2.currentText() self.ser.baudrate = int(self.s1__box_3.currentText()) self.ser.bytesize = int(self.s1__box_4.currentText()) self.ser.stopbits = int(self.s1__box_6.currentText()) self.ser.parity = self.s1__box_5.currentText() try: self.ser.open() except: QMessageBox.critical(self, "Port Error", "此串口不能被打開!") return None # 打開串口接收定時器,周期為2ms self.timer.start(2) if self.ser.isOpen(): self.open_button.setEnabled(False) self.close_button.setEnabled(True) self.formGroupBox1.setTitle("串口狀態(已開啟)") # 關閉串口 def port_close(self): self.timer.stop() self.timer_send.stop() try: self.ser.close() except: pass self.open_button.setEnabled(True) self.close_button.setEnabled(False) self.lineEdit_3.setEnabled(True) # 接收數據和發送數據數目置零 self.data_num_received = 0 self.lineEdit.setText(str(self.data_num_received)) self.data_num_sended = 0 self.lineEdit_2.setText(str(self.data_num_sended)) self.formGroupBox1.setTitle("串口狀態(已關閉)") # 發送數據 def data_send(self): if self.ser.isOpen(): input_s = self.s3__send_text.toPlainText() if input_s != "": # 非空字符串 if self.hex_send.isChecked(): # hex發送 input_s = input_s.strip() send_list = [] while input_s != '': try: num = int(input_s[0:2], 16) except ValueError: QMessageBox.critical(self, 'wrong data', '請輸入十六進制數據,以空格分開!') return None input_s = input_s[2:].strip() send_list.append(num) input_s = bytes(send_list) else: # ascii發送 input_s = (input_s + '/r/n').encode('utf-8') num = self.ser.write(input_s) self.data_num_sended += num self.lineEdit_2.setText(str(self.data_num_sended)) else: pass # 接收數據 def data_receive(self): try: num = self.ser.inWaiting() except: self.port_close() return None if num > 0: data = self.ser.read(num) num = len(data) # hex顯示 if self.hex_receive.checkState(): out_s = '' for i in range(0, len(data)): out_s = out_s + '{:02X}'.format(data[i]) + ' ' self.s2__receive_text.insertPlainText(out_s) else: # 串口接收到的字符串為b'123',要轉化成unicode字符串才能輸出到窗口中去 self.s2__receive_text.insertPlainText(data.decode('iso-8859-1')) # 統計接收字符的數量 self.data_num_received += num self.lineEdit.setText(str(self.data_num_received)) # 獲取到text光標 textCursor = self.s2__receive_text.textCursor() # 滾動到底部 textCursor.movePosition(textCursor.End) # 設置光標到text中去 self.s2__receive_text.setTextCursor(textCursor) else: pass # 定時發送數據 def data_send_timer(self): if self.timer_send_cb.isChecked(): self.timer_send.start(int(self.lineEdit_3.text())) self.lineEdit_3.setEnabled(False) else: self.timer_send.stop() self.lineEdit_3.setEnabled(True) # 清除顯示 def send_data_clear(self): self.s3__send_text.setText("") def receive_data_clear(self): self.s2__receive_text.setText("")if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) myshow = Pyqt5_Serial() myshow.show() sys.exit(app.exec_())
新聞熱點
疑難解答