国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

使用Python3+PyQT5+Pyserial 實現簡單的串口工具方法

2020-02-16 01:07:34
字體:
來源:轉載
供稿:網友

練手項目,先上圖

Python3+PyQT5+Pyserial 實現簡單的串口工具

先實現一個簡單的串口工具,為之后的上位機做準備

代碼如下:

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_())            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 拜城县| 乳源| 卢湾区| 富蕴县| 潮州市| 黑水县| 临西县| 天等县| 宝应县| 宜川县| 玛曲县| 兴安盟| 巴彦县| 图们市| 新民市| 常德市| 大姚县| 沈阳市| 波密县| 合阳县| 阳春市| 福清市| 方正县| 华蓥市| 利津县| 龙口市| 都安| 乐安县| 延长县| 武乡县| 云安县| 汉中市| 嵩明县| 阿瓦提县| 家居| 淳安县| 仙居县| 临夏市| 诸城市| 大新县| 始兴县|