【博客8】缤果PyQt5串口调试助手V1.1(初级篇)

2023-05-16

超级好用的Python QT GUI串口调试助手


目录

前言

一、软件概要:

二、软件界面:

1.App动态演示

2.其他扩展展示

三、main.py源码:

1.PyQt5_Serial_Debug_Assistant_V1.0源码

四、获取 >> 源码以及Git记录:

总结


前言

        Python串口调试助手支持常用的50bps - 10Mbps波特率,能设置校验、数据位和停止位,能以ASCII码或十六进制接收或发送任何数据或字符,可以任意设定自动发送周期,并能将接收数据实时保存成文本文件,能发送任意大小的数据或字符。

备注: V1.0为简单Demo,适合初级用户使用,V1.1可用于工程应用

高级版: 【博客9】缤果PyQt5串口调试助手V2.0(高级篇)_pyqt 串口助手_Bingo缤果的博客-CSDN博客


英文名:PyQt5_Serial_Debug_Assistant_V1.1
支持:常用的50bps ~ 10Mbps波特率
类型:串口调试助手
软件大小:18M
软件版本:V1.1
软件下载&更新:百度网盘链接_提取码 6666

一、软件概要:

        一款强大而稳定的PyQt串口调试助手,支持常用的110-921600bps波特率及自定义波特率,波特率最高可支持8000000(串口硬件有关),可适应于非标准波特率。支持动态修改串口和波特率,保存当前日志,打开当前日志以及实时保存日志(默认按每小时分包保存日志,100M自动清空接收窗口,防止UI阻塞)

二、软件界面:

1.App动态演示

2.其他扩展展示

 PyQt5_Serial_Debug_Assistant_V1.1

 PyQt5_Serial_Debug_Assistant_V1.1_串口UI布局

 PyQt5_Serial_Debug_Assistant_V1.0

三、main.py源码:

1.PyQt5_Serial_Debug_Assistant_V1.0源码

代码如下(示例):

import sys
import serial  # 导入模块  #安装: pip3 install pyserial
import serial.tools.list_ports
import webbrowser
import time
import datetime

# 导入Ui设计
from PyQt5.QtWidgets import QApplication, QMainWindow # 串口Ui文件
from PyQt5.QtWidgets import QMessageBox, QLabel, QFileDialog
from PyQt5.QtCore import QTimer
from PyQt5.QtGui import QIcon

import Serial_Ui_Designer  # 串口UI文件

# PyQt5程序打包
# 1.使用PyInstaller来打包:
# 安装:pip3 install PyInstaller
# 打包:pyinstaller -F -w -i=Com.ico main.py  #单文件打包-优缺点:只生成exe文件,但文件大,打开软件时加载时间长
# 打包:pyinstaller -D -w -i=Com.ico main.py  #多文件打包-优缺点:生成exe关联包,可删除无效库,文件小,运行顺畅

# 主窗口
class PyQt5_Serial(QMainWindow, Serial_Ui_Designer.Ui_MainWindow):
    # 初始化程序
    def __init__(self):
        super(PyQt5_Serial, self).__init__()
        self.setupUi(self)
        self.Init()
        self.Qt5_Ui_Init()

    # 初始化
    def Init(self):
        self.ser = serial.Serial()
        self.port_check()
        self.baudrateBox.setCurrentIndex(5)  # 921600-20 9600-5
        self.dataBitsBox.setCurrentIndex(3)   # 8

        # 设置Logo和标题
        self.setWindowIcon(QIcon('Com.ico'))
        self.setWindowTitle("PyQt5_串口调试助手_V1.0")
        #self.setWindowTitle("PyQt5_Serial_Debug_Assistant_V1.0")

        # 发送数据和接收数据数目置零
        self.data_num_sended = 0
        self.label_Tx.setText(str(self.data_num_sended))
        self.data_num_received = 0
        self.label_Rx.setText(str(self.data_num_received))

        # 串口关闭按钮使能关闭
        self.sendButton.setEnabled(0)
        self.checkBox_autoSend.setEnabled(0)

        # 发送框、文本框清除
        self.sendTextEdit.setText("")
        self.recvTextEdit.setText("")

    # 建立控件信号与槽关系
    def Qt5_Ui_Init(self):
        # 串口检测按钮
        self.pushButton_Refresh.clicked.connect(self.port_check)
        # 串口打开按钮
        self.pushButton_Open_Close.clicked.connect(self.port_open_close)
        # 定时发送数据
        self.timer_send = QTimer()
        self.timer_send.timeout.connect(self.data_send)
        self.checkBox_autoSend.stateChanged.connect(self.data_send_timer)
        # 发送数据按钮
        self.sendButton.clicked.connect(self.data_send)
        # 保存日志
        self.pushButton_saveLog.clicked.connect(self.savefiles)
        # 加载文件
        self.pushButton_openLog.clicked.connect(self.openfiles)
        # 跳转链接
        self.commandLinkButton.clicked.connect(self.link)
        # 清除发送按钮
        self.pushButton_ClearSend.clicked.connect(self.send_data_clear)
        # 清除接收按钮
        self.pushButton_ClearRecive.clicked.connect(self.receive_data_clear)
		# RTS
        self.checkBox_RTS.clicked.connect(self.rts_handle)
		# DTR
        self.checkBox_DTR.clicked.connect(self.dtr_handle)

    # 串口检测
    def port_check(self):
        # 检测所有存在的串口,将信息存储在字典中
        self.Com_Dict = {}
        port_list = list(serial.tools.list_ports.comports())

        self.portNameBox.clear()
        for port in port_list:
            self.Com_Dict["%s" % port[0]] = "%s" % port[1]
            self.portNameBox.addItem(port[0])

        # 无串口判断
        if len(self.Com_Dict) == 0:
            self.portNameBox.addItem("无串口")

    # 打开/关闭串口
    def port_open_close(self):
        if self.pushButton_Open_Close.text() == "打开串口":
            self.port_open()
        else:
            self.port_close()

    # 打开串口
    def port_open(self):
        port = self.portNameBox.currentText()
        # print("port:", port)

        baudrate = int(self.baudrateBox.currentText())
        # print("baudrate:", baudrate)

        bytesize = int(self.dataBitsBox.currentText()) # 数据位
        # print("bytesize:", bytesize)

        parity = self.ParityBox.currentText()  # 校验位
        # print("parity:", parity)

        stopbits = self.stopBitsBox.currentText() # 停止位
        # print("stopbits:", stopbits)

        flowctrl = self.flowControlBox.currentText()  # 流控

        self.ser.port = port
        self.ser.baudrate = baudrate

        # print("bytesize:", bytesize)
        if bytesize == 5:
            self.ser.bytesize = serial.FIVEBITS
        elif bytesize == 6:
            self.ser.bytesize = serial.SIXBITS
        elif bytesize == 7:
            self.ser.bytesize = serial.SEVENBITS
        elif bytesize == 8:
            self.ser.bytesize = serial.EIGHTBITS
        else:
            self.ser.bytesize = serial.EIGHTBITS

        # print("parity:", parity)
        if parity == "None":
            self.ser.parity = serial.PARITY_NONE
        elif parity == "Even":
            self.ser.parity = serial.PARITY_EVEN
        elif parity == "Odd":
            self.ser.parity = serial.PARITY_ODD
        elif parity == "Space":
            self.ser.parity = serial.PARITY_SPACE
        elif parity == "Mark":
            self.ser.parity = serial.PARITY_MARK
        else:
            self.ser.parity = serial.PARITY_NONE

        # print("stopbits:", stopbits)
        if stopbits == "1":
            self.ser.stopbits = serial.STOPBITS_ONE
        elif stopbits == "1.5":
            self.ser.parity = serial.STOPBITS_ONE_POINT_FIVE
        elif stopbits == "2":
            self.ser.parity = serial.STOPBITS_TWO
        else:
            self.ser.stopbits = serial.STOPBITS_ONE

        self.ser.xonxoff = False  # 软件流控
        self.ser.rtscts  = False  # 硬件流控 RTS
        self.ser.dsrdtr  = False  # 硬件流控 DTR
        # print("flowctrl:", flowctrl)
        if flowctrl == "OFF":
            self.ser.xonxoff = False  # 软件流控
            self.ser.rtscts  = False  # 硬件流控 RTS
            self.ser.dsrdtr  = False  # 硬件流控 DTR
        elif flowctrl == "Hardware":
            if self.checkBox_DTR.isChecked():
                self.ser.dsrdtr = True  #硬件流控 DTR
            if self.checkBox_RTS.isChecked():
                self.ser.rtscts = True  #硬件流控 RTS
        elif flowctrl == "Software":
            self.ser.xonxoff = True   # 软件流控
            self.ser.rtscts  = False  # 硬件流控 RTS
            self.ser.dsrdtr  = False  # 硬件流控 DTR

        # print(self.ser)
        # Serial < id = 0x4883040, open = False > (port='COM1', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)

        try:
            self.ser.open()
        except:
            QMessageBox.critical(self, "串口异常", "串口打开失败! 错误: 拒绝访问(被占用).")
            return None

        # 串口打开后,切换开关串口按钮使能状态,防止失误操作
        if self.ser.isOpen():
            self.pushButton_Open_Close.setText("关闭串口")
			
            self.portNameBox.setEnabled(0)
            self.baudrateBox.setEnabled(0)
            self.dataBitsBox.setEnabled(0)
            self.ParityBox.setEnabled(0)
            self.stopBitsBox.setEnabled(0)
            self.flowControlBox.setEnabled(0)
						
            self.pushButton_Refresh.setEnabled(0)
            self.sendButton.setEnabled(1)
            self.checkBox_autoSend.setEnabled(1)

            # 定时器接收数据
            self.timer = QTimer()
            self.timer.timeout.connect(self.data_receive)
            # 打开串口接收定时器,周期为1ms
            self.timer.start(1)

    # 关闭串口
    def port_close(self):
        try:
            self.timer.stop()
            self.timer_send.stop()
            self.ser.close()
            self.pushButton_Open_Close.setText("打开串口")
			
            self.portNameBox.setEnabled(1)
            self.baudrateBox.setEnabled(1)
            self.dataBitsBox.setEnabled(1)
            self.ParityBox.setEnabled(1)
            self.stopBitsBox.setEnabled(1)
            self.flowControlBox.setEnabled(1)

            self.pushButton_Refresh.setEnabled(1)
            self.sendButton.setEnabled(0)
            self.checkBox_autoSend.setEnabled(0)
        except:
            QMessageBox.critical(self, '串口异常', '关闭串口失败,请重启程序!')
            return None

    # 定时发送数据
    def data_send_timer(self):
        try:
            if 1<= int(self.spinBox_timeDly.text()) <= 300000:  # 定时时间1ms~30s内
                if self.checkBox_autoSend.isChecked():
                    self.timer_send.start(int(self.spinBox_timeDly.text()))
                    self.spinBox_timeDly.setEnabled(False)
                else:
                    self.timer_send.stop()
                    self.spinBox_timeDly.setEnabled(True)
            else:
                QMessageBox.critical(self, '定时发送数据异常', '定时发送数据周期仅可设置在300秒内!')
        except:
            QMessageBox.critical(self, '定时发送数据异常', '请设置正确的数值类型!')

    # 发送数据
    def data_send(self):
        if self.ser.isOpen():
            input_s = self.sendTextEdit.toPlainText()

            # 判断是否为非空字符串
            if input_s != "":
                # 时间显示
                if self.checkBox_displayTime.isChecked():
                    if self.checkBox_displaySend.isChecked():
                        self.recvTextEdit.insertPlainText(self.get_datetime())

                # HEX发送
                if self.checkBox_hexSend.isChecked():
                    #input_s = input_s.strip() #strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。
                    input_s = input_s.replace(" ", "")
                    send_list = []
                    while input_s != '':
                        try:
                            num = int(input_s[0:2], 16) # 没有步长的简单切片
                            #print( hex(num) )
                        except ValueError:
                            QMessageBox.critical(self, '数据异常', '请输入规范的十六进制数据!')
                            return None

                        input_s = input_s[2:]
                        send_list.append(num)

                    if self.checkBox_CR_LF.isChecked():
                        send_list.append(0x0D)
                        send_list.append(0x0A)

                    input_s = bytes(send_list)
                # ASCII发送
                else:
                    if self.checkBox_CR_LF.isChecked():
                        input_s += '\r\n'

                    input_s = (input_s).encode('utf-8')

                # HEX接收显示
                if self.checkBox_hexReceive.isChecked():
                    out_s = ''
                    for i in range(0, len(input_s)):
                        out_s = out_s + '{:02X}'.format(input_s[i]) + ' '

                    if self.checkBox_displaySend.isChecked():
                        self.recvTextEdit.insertPlainText(out_s)
                # ASCII接收显示
                else:
                    if self.checkBox_displaySend.isChecked():
                        self.recvTextEdit.insertPlainText(input_s.decode('utf-8'))

                    # 接收换行
                if self.checkBox_AutoLineBreak.isChecked():
                    if self.checkBox_displaySend.isChecked():
                        self.recvTextEdit.insertPlainText('\r\n')

                # 获取到Text光标
                textCursor = self.recvTextEdit.textCursor()
                # 滚动到底部
                textCursor.movePosition(textCursor.End)
                # 设置光标到Text中去
                self.recvTextEdit.setTextCursor(textCursor)

                # 统计发送字符数量
                num = self.ser.write(input_s)
                self.data_num_sended += num
                self.label_Tx.setText(str(self.data_num_sended))
        else:
            pass

    # 接收数据
    def data_receive(self):
        try:
            num = self.ser.inWaiting()
            # if num > 0:
            #     time.sleep(0.1) #100ms
            #     num = self.ser.inWaiting()  # 延时,再读一次数据,确保数据完整性
        except:
            # QMessageBox.critical(self, '串口异常', '串口接收数据异常,请重新连接设备!')
            # self.port_close()
            return None

        if num > 0:
            data = self.ser.read(num)
            num = len(data)

            # HEX显示数据
            if self.checkBox_hexReceive.checkState():
                # 时间显示
                if self.checkBox_displayTime.isChecked():
                    self.recvTextEdit.insertPlainText(self.get_datetime())
                out_s = ''
                for i in range(0, len(data)):
                    out_s = out_s + '{:02X}'.format(data[i]) + ' '

                self.recvTextEdit.insertPlainText(out_s)
                # 接收换行
                if self.checkBox_AutoLineBreak.isChecked():
                    self.recvTextEdit.insertPlainText('\r\n')
            # ASCII显示数据
            else:
                try:
                    if self.checkBox_displayTime.isChecked():
                        displayStr = self.get_datetime()
                        displayStr += data.decode('utf-8',"ignore")
                        displayStr = displayStr.replace("\n", "\n" + self.get_datetime())
                        # 接收换行
                        if self.checkBox_AutoLineBreak.isChecked():
                            displayStr += "\r\n"  # 接收换行
                        self.recvTextEdit.insertPlainText(displayStr)
                    else:
                        self.recvTextEdit.insertPlainText(data.decode('utf-8',"ignore"))
                        # 接收换行
                        if self.checkBox_AutoLineBreak.isChecked():
                            self.recvTextEdit.insertPlainText('\r\n')
                except Exception as e:
                    print("接收数据异常,波特率错误,请重新配置!\n", e)

            # 获取到text光标
            textCursor = self.recvTextEdit.textCursor()
            # 滚动到底部
            textCursor.movePosition(textCursor.End)
            # 设置光标到text中去
            self.recvTextEdit.setTextCursor(textCursor)

            # 统计接收字符的数量
            self.data_num_received += num
            self.label_Rx.setText(str(self.data_num_received))
        else:
            pass

    # 保存日志
    def savefiles(self):
        dlg = QFileDialog()
        filename = self.portNameBox.currentText() + time.strftime("_%Y-%m-%d_%H_%M_%S", time.localtime())
        filenames = dlg.getSaveFileName(None, "保存日志文件", filename, "Txt files(*.txt)")

        try:
            with open(file = filenames[0], mode='w', encoding='utf-8') as file:
                file.write(self.recvTextEdit.toPlainText())
        except:
            #QMessageBox.critical(self, '日志异常', '保存日志文件失败!')
            pass
        
    # 加载日志
    def openfiles(self):
        dlg = QFileDialog()
        filenames = dlg.getOpenFileName(None, "加载日志文件", None, "Txt files(*.txt)")

        try:
            with open(file = filenames[0], mode='r', encoding='utf-8') as file:
                self.sendTextEdit.setPlainText(file.read())
        except:
            # QMessageBox.critical(self, '日志异常', '加载日志文件失败!')
            pass
				
    # 打开博客链接
    def link(self):
        webbrowser.open('https://blog.csdn.net/santu5234?type=blog')

    # 清除发送数据显示
    def send_data_clear(self):
        self.sendTextEdit.setText("")

        self.data_num_sended = 0
        self.label_Tx.setText(str(self.data_num_sended))

    # 清除接收数据显示
    def receive_data_clear(self):
        self.recvTextEdit.setText("")

        self.data_num_received = 0
        self.label_Rx.setText(str(self.data_num_received))

        self.data_num_sended = 0
        self.label_Tx.setText(str(self.data_num_sended))

    # 时间格式
    def get_datetime(self):
        time_now = datetime.datetime.now()
        # print(str(time_now)[:-3])
        time_now = "[" + str(time_now)[:-3] + "] "  # 转为字符串后切片
        return time_now

    # RTS
    def rts_handle(self):
        if self.ser.isOpen():
            if self.checkBox_RTS.isChecked():
                self.ser.setRTS(1)
            else:
                self.ser.setRTS(0)
    # DTR
    def dtr_handle(self):
        if self.ser.isOpen():
            if self.checkBox_DTR.isChecked():
                self.ser.setDTR(1)
            else:
                self.ser.setDTR(0)

# 主函数
def main():
    print("Hello, I'm PyQt5_Serial_Debug_Assistant_V1.0")
    # 1、创建QApplication类的实例对象
    app = QApplication(sys.argv)
    # 2、创建一个 PyQt5_Serial 实例对象
    myMainWindow = PyQt5_Serial()
    # 3、显示主窗口
    myMainWindow.show()
    # 4、进入程序的主循环、并通过exit函数确保主循环安全结束
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

四、获取 >> 源码以及Git记录:

PyQt5_Serial_Debug_Assistant_V1.0&V1.1


总结

欢迎下载&更新使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【博客8】缤果PyQt5串口调试助手V1.1(初级篇) 的相关文章

  • FreeRTOS vTaskDelay 卡死

    在Task中使用动态方法创建任务后 xff0c 在任务中调用vTaskDelay卡死 xff0c 然后排查问题 xff0c 定时器工作正常 xff0c 如果不使用vTaskDelay也可以一直运行 解决办法 xff0c 改成在main方法中
  • 图像为什么能相减

    前面提到 xff0c 我们可以把图像看作一个函数 xff0c 函数和函数之间是可以相加的 f x y 61 I 1 x y 43 I 2 x y 那么 xff0c 既然函数可以相加 xff0c 函数也是可以相减的 所以 xff0c 图像之间
  • 分析评估和定位声音质量

    64 author wangdaopo 64 email 3168270295 64 qq com 影响音频质量和稳定性的因素 音质好坏的评价 xff0c 响度 音高 音色 xff0c 测试 xff0c 你的语音引擎是基本可用的 xff0c
  • Linux下Clang-format代码格式化

    64 author wangdaopo 64 email 3168270295 64 qq com 1 Clang format 代码格式化介绍 平时团队进行合作的时候需要注意代码的格式 xff0c 虽然很难统一每个人的编码风格 xff0c
  • OOM问题预防和排查内存泄漏及解决方法

    64 author wangdaopo 64 email 3168270295 64 qq com 理解了这个算法我们就理解了为啥 MySQL 躺着也能中枪了 xff0c 因为它的体积总是最大 xff08 一般来说它在系统上占用内存最多 x
  • API调用次数限制实现

    API调用次数限制实现 在开发接口服务器的过程中 xff0c 为了防止客户端对于接口的滥用 xff0c 保护服务器的资源 xff0c 通常来说我们会对于服务器上的各种接口进行调用次数的限制 比如对于某个 用户 xff0c 他在一个时间段 x
  • 虚拟声卡

    一 虚拟声卡是什么 xff1f 虚拟声卡是一种软件产品 xff0c 它只对声音数字信号进行处理 虽然它不能产生声音 xff0c 但可以用来实现声音的传输 存储或混音等功能 1 xff09 虚拟声卡工作原理 xff1a 虚拟声卡通过软件技术实
  • 常用排查调试工具

    64 author wangdaopo 64 email 3168270295 64 qq com 工具 描述 strace Linux分析程序运行速度瓶颈 strace是个功能强大的Linux调试分析诊断工具 尤其是针对源码不可读或源码无
  • meson是用Python语言开发的构建工具,编译需要Ninja(用C++实现)命令。Meson 旨在开发最具可用性和快速的构建系统。

    目录 一 meson和ninja简介 二 meson构建和ninja编译环境搭建 三 meson构建和ninja编译程序使用步骤 四 项目构建工具Meson PyAnnolib pyBit Open Build Service介绍 五 参考
  • 一套实时音视频传输机制和QOS策略选择及语音视频SDK的选型标准

    64 author wangdaopo 64 email 3168270295 64 qq com 语音视频SDK的选型标准 设备的问题 网络部分 物理场景 一套实时的传输机制 sip是通讯协议 xff0c sip只是信令 xff0c 就是
  • sample.html

    目录 一 Html使用注意 1 二 界面设计 xff08 css xff09 9 三 表单使用 15 Jquery判断表单是否修改 15 表单序列化为json对象 16 json对象转为json字符串 16 json对象赋值到表单 xff0
  • Cgi使用

    目录 一 CGI xff08 通用网关接口 xff09 是外部扩展应用程序与 Web 服务器交互的一个标准接口 1 二 web服务器配置 3 三 Cgi编程 xff08 根据CGI标准 xff0c 编写Web服务器运行时的外部扩展应用程序
  • mmap内存映射在应用和内核/驱动交互,进程间交互,大规模数据传输/大文件读写中的使用

    目录 一 Mmap用途 步骤实例 细节 及相关函数 2 1 mmap函数主要用途有三个 xff08 应用和内核 驱动交互 xff0c 进程间交互 xff0c 大规模数据传输 大文件读写 xff09 2 2 使用步骤 xff1a 所有对mma
  • PID控制器整理分享

    概述 日常开发中 xff0c 常常需要对速度 温度等物理量进行稳态控制 xff0c 而在目前的自动化控制原理中 xff0c 使用最为广泛的方法就是PID控制算法 本文简要整理分享PID控制器的使用 正文 PID控制器 xff0c 即比例 积
  • Markdown插入图片的方法

    Markdown插入图片的方法 Markdown插入图片的语法 xff1a alt 属性文本 图片地址 alt 属性文本 图片地址 34 可选标题 34 说明 xff1a 以感叹号开头 接着一个中括号 接着一个小括号 xff0c 里面放上图
  • SLA的基本概念

    SLA的基本概念 现在的产品和系统都非常的复杂 xff0c 彼此连接依赖越来越复杂 xff0c 为了整体的高速运转 xff0c 对每个部件的稳定性越来越高 xff0c 越来越精密 xff0c 发展到一定程度 xff0c 人力已经无法掌控 x
  • ssh远程登录可能出现的问题以及解决办法

    首先 确保server端的ssh服务是开的 xff08 service shhd start xff09 然后在client端输入 xff1a ssh usrname 64 serverip xff08 远程登录 xff09 scp fil
  • 各种滤波原理

    1 维纳滤波 维纳滤波是一种平稳随机过程的最佳滤波理论 xff0c 换句话说就是在滤波过程中系统的状态参数 xff08 或信号的波形参数 xff09 是稳定不变的 它将所有时刻的采样数据用来计算互相关矩阵 xff0c 涉及到解维纳 xff0
  • MTCNN算法提速应用(ARM测试结果评估)

    经博主测试 xff0c mtcnn原三层网络如果用于工程测试 xff0c 误检情况严重 xff0c 在fddb上测试结果也是 xff0c 经常将手或者耳朵 检测为人脸 xff0c 这个很头疼 xff08 因为标注数据 xff01 xff09
  • 国外知名音频库一站式资料和简介

    Speex Speex http blog csdn net xyz lmn article details 8013490 简介 Speex是一套主要针对语音的开源免费 xff0c 无专利保护的音频压缩格式 Speex工程着力于通过提供一

随机推荐

  • vs2010调试工具栏不可用(变灰)解决办法

    菜单中页不能进行调试 使用vs的命令行工具 在命令行中运行 xff1a devenv ResetSkipPkgs 重新打开vs xff08 注 xff1a 第一次没有关闭vs xff0c 运行这条命令后 xff0c 会新打开vs没有变化 x
  • STM32 抗锯齿中文显示另类方案分享

    STM32 抗锯齿中文显示另类方案分享 最近在玩车载液晶仪表 xff0c 之前用Arduino 43 USART液晶 xff0c 后来发现Arduino性能不够 xff0c 就转向STM32 由于需要在液晶屏上显示手机信息 xff0c 先是
  • [Pixhawk] ardupilot源码windows编译教程

    声明 此教程最开始取自于淘宝商家 xff0c 后查找资料发现淘宝商家取自 怒飞垂云 的教程 xff0c 但原教程中有些冗余和错误导致无法通过编译 xff0c 我做更改整理后发出 xff0c 如有疑问请各位一起讨论 目录 一 建立飞控固件编译
  • pixhawk MP地面站 NTF_LED参数相关

    NeoPixel Copter documentation 这一部分里面的NTF相关参数 xff0c 对应MP地面站里的这几项 不是给外接WS2812设置的 我折腾了一下午 xff0c 再更改了其他一些参数后 xff0c 导致飞控上那个最大
  • 无人机betaflight 地面站遥控器通道最低点不是1000,最高点不是2000,中点不是1500的调整办法

    参考老外的视频 How to fix the endpoints of your Rx channels with RXRANGE in Betaflight or Cleanflight EASY FIX 需要进入CLI界面 xff0c
  • 八皇后详解

    历史 八皇后问题是一个古老而著名的问题 xff0c 是回溯算法的典型例题 该问题是十九世纪著名的数学家高斯1850年提出 xff1a 在8X8格的国际象棋上摆放八个皇后 xff0c 使其不能互相攻击 xff0c 即任意两个皇后都不能处于同一
  • KVM虚拟机创建功能详细讲解

    KVM虚拟机创建功能详细讲解 一 KVM虚拟机创建的用户操作 对于用户或者管理员来说 xff0c 虚拟机的创建有着很多的方法 xff0c 例如 xff1a kvm自带命令行工 具 使用virsh命令来创建 使用具有图形界面的virt man
  • JS中堆和栈

    什么是栈和堆 栈和堆的主要作用存储变量 xff0c 根据变量值得不同存储的位置也不同 在JS中 xff0c 栈主要是存储基本类型的变量 xff0c 包括String Number Boolean Undefined Null 和 对象类型的
  • 实例:Python调用c++文件(参数为指针和数组指针)

    本文作为Python调用c 43 43 的进阶实现 xff0c 简单的实现参考文章Python调用c 43 43 高级 xff08 swig xff09 1 一个小小的工作目标 通过Python调用c 43 43 文件 xff0c 生成一个
  • RT-Thread学习笔记——信号量

    前言 本文讲RT Thread的线程间同步之信号量 xff0c 包括为什么要进行线程间同步 信号量创建与删除 信号量获取与释放以及基于STM32的二值信号量示例和计算型信号量示例 xff0c 采用RTT amp 正点原子联合出品潘多拉开发板
  • ssh Connection closed by remote host解决

    描述 最近某台服务器隔一段时间就会有ssh连接失败的告警 xff0c 但是上去排查的时候会发现ssh并没有连接失败的错误 后来有在ssh的地方添加日志 xff0c 打印错误的输出 xff0c 最终得到的报错Stderr ssh exchan
  • linux-2.6.32.6源码目录结构分析及其driver所占比重

    find maxdepth 1 type d name exec du sh 未编译个目录文件大小 xff1a 423M linux 2 6 32 6 5 8M firmware 1 3M lib 140K init 144K virt 2
  • Formatter(格式化)和 Converter(格式化)

    功能 xff1a Spring框架的功能 xff0c Formatter和Converter均可以将一种对象类型转换成另一种对象类型 区别 xff1a Converter是通用元件 xff0c 可以在应用程序的任意层中使用 Formatte
  • 牛人 就是这样锤炼出来的,中兴资深工程师,嵌入式专家韦东山是这样炼成的!

    导读 xff1a 还在大学的你 xff0c 不知道未来何去何从 xff1f 都说迷茫是大事做不了 xff0c 小事不想做 还在做程序袁的你 xff0c 是不是也想创业 xff1f 程序袁好创业吗 xff1f Linux好学吗 xff1f 学
  • Windows下编译PX4源码并连接simulink

    目录 一 安装UAV支持PX4飞行器支持包二 下载工具链对于2019a对于2021a 三 克隆PX4源码四 构建PX4固件固件的选择编译指令报错的处理 五 MATLAB的Test Connection 一 安装UAV支持PX4飞行器支持包
  • ubuntu树莓派3/4B+的GPIO硬件串口通信

    目录 一 概要二 树莓派硬件常识三 交换硬件串口和mini串口映射关系3 1 查看原始映射3 2 编辑config文件 xff0c 置换硬件映射3 3 禁用蓝牙 四 串口功能配置4 1 编辑cmdline文件4 2 禁用蓝牙4 3 串口功能
  • JS运行原理,宏任务微任务的任务loop驱动模式

    要拎清运行原理 xff0c 就要知道js有什么无理限制和主要解决什么问题 首先 xff0c js是单线程的 xff0c 不能开辟多线程 这决定了它支持并发 xff0c 不支持并行 并发 强调的是可以一起 出 发 xff0c 并行 强调的是可
  • 关于CPU C-States 省电模式,你需要知道的事情

    为了在CPU空闲的时候降低功耗 xff0c CPU可以被命令进入low power模式 每个CPU都有几种power模式 xff0c 这些模式被统称为C states或者C modes lower power模式最早在486DX4处理器上被
  • nginx如何部署多个web应用(vue)

    服务器资源与域名资源都是有限的 xff0c 如何在同一个域名下部署多个vue项目 xff08 nginx反向代理 xff09 xff0c 通过域名后面的不同的URI来访问不同的应用 xff0c 来解决资源不足的问题 xff0c 在此期间遇到
  • 【博客8】缤果PyQt5串口调试助手V1.1(初级篇)

    超级好用的Python QT GUI串口调试助手 目录 前言 一 软件概要 xff1a 二 软件界面 xff1a 1 App动态演示 2 其他扩展展示 三 main py源码 xff1a 1 PyQt5 Serial Debug Assis