Python testSerial 串口调试助手 代码 存

该代码示例展示了如何使用Python的logging模块创建日志功能,以及使用PyQt5设计GUI界面进行串口通信。程序包括了打开、关闭串口,发送和接收数据的功能,并通过GUI更新显示。此外,还包含了对可用串口的枚举。
摘要由CSDN通过智能技术生成

把Log先建了/复制进来:

# coding:utf-8


import os
import datetime

# from Socket_Client.Socket_Client import socket_client

logaddr = os.path.split(os.path.realpath(__file__))[0]


class log():

    @staticmethod
    def outputlog(*logcontent):
        logs = 'log:'
        if len(logcontent) <= 0:
            print('log empty ')
        else:
            for i in (logcontent):
                logs += str(i) + ';'
            # output = open(logaddr+'\\Logs\\log' + str(datetime.datetime.now().strftime('%Y_%m_%d_%H_%M'))+'.txt','a')
            output = open(logaddr + '\\Logs\\log' + str(datetime.datetime.now().strftime('%Y_%m_%d')) + '.txt', 'a')
            output.write(str(datetime.datetime.now()) + ' :' + str(logs) + '\n')
            print(logs)
            # log.outputlog(logs)
            output.close()

ui用的PyQt5,designer设计完之后PyUIC生成一下,代码如下:

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

# Form implementation generated from reading ui file 'My_Serial.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


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(590, 590)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.Serial = QtWidgets.QLabel(self.centralwidget)
        self.Serial.setGeometry(QtCore.QRect(100, 60, 70, 20))
        self.Serial.setScaledContents(False)
        self.Serial.setAlignment(QtCore.Qt.AlignCenter)
        self.Serial.setWordWrap(False)
        self.Serial.setIndent(-1)
        self.Serial.setObjectName("Serial")
        self.Serial_List = QtWidgets.QComboBox(self.centralwidget)
        self.Serial_List.setGeometry(QtCore.QRect(190, 60, 280, 20))
        self.Serial_List.setObjectName("Serial_List")
        self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
        self.textEdit.setGeometry(QtCore.QRect(100, 170, 370, 60))
        self.textEdit.setObjectName("textEdit")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(100, 280, 71, 31))
        self.label_2.setAlignment(QtCore.Qt.AlignCenter)
        self.label_2.setObjectName("label_2")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(100, 140, 70, 30))
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(400, 100, 75, 23))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(400, 250, 75, 23))
        self.pushButton_2.setObjectName("pushButton_2")
        self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
        self.textBrowser.setGeometry(QtCore.QRect(100, 310, 371, 71))
        self.textBrowser.setObjectName("textBrowser")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 590, 23))
        self.menubar.setObjectName("menubar")
        self.menu1111 = QtWidgets.QMenu(self.menubar)
        self.menu1111.setObjectName("menu1111")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.menubar.addAction(self.menu1111.menuAction())

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "串口调试助手"))
        self.Serial.setText(_translate("MainWindow", "串口:"))
        self.label_2.setText(_translate("MainWindow", "输出:"))
        self.label.setText(_translate("MainWindow", "输入:"))
        self.pushButton.setText(_translate("MainWindow", "连接"))
        self.pushButton_2.setText(_translate("MainWindow", "输入"))
        self.menu1111.setTitle(_translate("MainWindow", "1.0.0.2.1"))

简简单单写个就不搞Basic_Command了

写个test试一下读写收发:

import serial
import time

test = serial.Serial(port='COM4', baudrate=115200, bytesize=8, stopbits=1, timeout=10)
print(test)

print(test.is_open)
test.close()
print(test.is_open)
test.open()
print(test.is_open)

msg = {'head': 0xF1, 'op': 0xF7, 'C1': 0x0A, 'C2': 0x01, 'end': 0xF2}
m = bytearray()
for v in msg.values():
    m.append(int(v))
print(m)

a = test.write(m)
print(a, '\n')

ot = 0.00001
st = time.time()
while True:
    et = time.time()
    if et - st < ot:
        b = test.read(4)
        b = str(b)
    else:
        break
    print(b, '\n')

中间的SerialUtile:

import serial
import serial.tools.list_ports
from Logs.log import log


class SerialUtile:
    def __init__(self):
        self.testSerial = serial.Serial()

    @staticmethod
    def get_ports():
        port_list = list(serial.tools.list_ports.comports())
        available_ports = []
        if len(port_list) == 0:
            available_ports.append("No ports!")
        else:
            for port in port_list:
                available_ports.append(str(port))
        return available_ports

    def open_serial(self, port_name):
        try:
            if self.testSerial.is_open:
                log.outputlog("Port has been open! Now closing!")
                self.testSerial.close()
            if port_name:
                self.testSerial.port = port_name
                self.testSerial.baudrate = 115200
                self.testSerial.bytesize = 8
                self.testSerial.stopbits = 1
                self.testSerial.timeout = 30
                self.testSerial.open()
                log.outputlog("Port %s is open!" % str(self.testSerial.port))
            else:
                log.outputlog("Have no port! Retry!")
            return self.testSerial.is_open
        except Exception as e:
            log.outputlog("Open serial port error : %s" % e)
            self.testSerial.close()

    def send_message_and_recv(self, port_name, text):
        try:
            if not self.testSerial.is_open:
                # self.testSerial.port = port_name
                # self.testSerial.baudrate = 115200
                # self.testSerial.bytesize = 8
                # self.testSerial.stopbits = 1
                # self.testSerial.timeout = 30
                # self.testSerial.open()
                self.open_serial(port_name)
            self.testSerial.write(text)
            a = self.testSerial.read(4)
            return a
        except Exception as e:
            log.outputlog("Send Message And Recv error : %s" % e)
            self.testSerial.close()


if __name__ == '__main__':
    print('')

最终的testSerial:

import sys
import re
from PyQt5.QtWidgets import QApplication, QMainWindow
from My_Serial import Ui_MainWindow
from Logs.log import log
from SerialUtile import SerialUtile as Ser

# 固定格式(字节流……)的转换


class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.initialize_ui()
        self.ui.pushButton.clicked.connect(self.open_port)
        self.selectPort = None
        self.openSelectPort = None
        self.ui.pushButton_2.clicked.connect(self.get_set_text)

    def initialize_ui(self):
        available_ports = Ser().get_ports()
        for port in available_ports:
            self.ui.Serial_List.addItem(port)

    def open_port(self):
        self.selectPort = re.split(" - | ' ' ", self.ui.Serial_List.currentText())
        self.openSelectPort = Ser().open_serial(self.selectPort[0])

    # F1F70A01F2
    def get_set_text(self):
        # msg = {'head': 0xF1, 'op': 0xF7, 'C1': 0x00, 'C2': 0x00, 'end': 0xF2}
        text = self.ui.textEdit.toPlainText()
        if len(text) == 0:
            return
        x = bytes.fromhex(text)
        # temp = []
        # for i in x:
        #     temp.append('0x%02X' % i)
        # for i, key in enumerate(msg):
        #     msg[key] = temp[i]
        # t = bytearray()
        # for v in msg.values():
        #     t.append(int(v, 16))
        t = bytearray(x)
        a = Ser().send_message_and_recv(self.selectPort[0], t)
        r = []
        for i in a:
            r.append('%02X ' % i)
        rr = ''.join(r)
        self.ui.textBrowser.setPlainText(str(rr))
        log.outputlog("Send Message : %s" % t)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    # 创建 QApplication 对象(当前运行地址)

    w = MainWindow()
    # 创建窗口
    # w.setWindowTitle("串口调试")
    # # 设窗口标题
    w.show()
    # 展示窗口

    sys.exit(app.exec_())
    # 系统,退出,QApplication程序的(事件检测)循环等待状态

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值