基于QT:温度串口图像显示

2023-11-15

用Qt自己写一个上位机,将串口发过来的温度信息,显示出来,并且绘画出温度曲线
上图:
这里写图片描述
采用QT绘画曲线,首先当然是采用,qwt控件,而Qt没有自带的qwt控件,所以需要按住移植qwt控件方法具体步骤如下:
1. Download and install QT 5.0.1 (MinGw) to: “C:\Qt\Qt5.0.1”
2. Download and extract Qwt 6.1 RC3 to: “C:\qwt-6.1-rc3”
3. Add “C:\Qt\Qt5.0.1\5.0.1\mingw47_32\bin” to your systems path variable (qmake.exe is located here)
4. Add “C:\Qt\Qt5.0.1\Tools\MinGW\bin” to your systems path variable (mingw32-make.exe is located here)
5. Open a command line (cmd) and navigate to: “C:\qwt-6.1-rc3”
6. Type: “qmake” (This command won’t prompt any msg so don’t worry)
7. Type: “mingw32-make” (Compiles the whole project with examples; this will take a while so be patient)
8. Type: “mingw32-make install” (This installs qwt to the directory set in “C:\qwt-6.1-rc3\qwtconfig.pri”; the default location is “C:/Qwt-QWT_VERSION-rc3” -> “C:\Qwt-6.1.0-rc3\”)
9. Add “C:\Qwt-6.1.0-rc3\lib” to your systems path variable
10. Add a User variable named “QT_PLUGIN_PATH” with the following path “C:\Qwt-6.1.0-rc3\plugins”
11. Add a User variable named “QMAKEFEATURES” with the following path “C:\Qwt-6.1.0-rc3\features”
12. Start Qt Creator
13. Create a new project: File -> New File or Project … -> Applications -> Qt Gui Application -> Choose
14. Name it “Test”
15. Create the project in the following directory: “C:\workspace”
16. Open file “Test.pro”
17. Add “Config += qwt” at the bottom
18. Open the main.c of the project and delete all its content.
19. Paste the following in the main.c (This is the qwt example “simpleplot”):
既如下步骤,当然,中国网站上大多数都是采用直接添加一些LIB到.pro文件中去,个人感觉这种方法不是很好,所以就翻墙看了看:
1.下载并安装QT 5.0.1(MinGW的)到“C:\ Qt的\ Qt5.0.1”
2.下载并解压缩QWT 6.1 RC3到:“C:\ QWT-6.1-RC3”
3.添加“C:\ Qt的\ Qt5.0.1 \ 5.0.1 \ mingw47_32 \ BIN”到你的系统路径变量(qmake.exe就设在这里)
4.添加“C:\ Qt的\ Qt5.0.1 \ TOOLS \ MinGW的\ BIN”到你的系统路径变量(的mingw32-的make.exe就设在这里)
5.打开命令行(CMD)并导航到:“C:\ QWT-6.1-RC3”
6.键入:“qmake”(该命令将不会提示任何MSG所以不用担心)
7.键入“mingw32-make”(编译举例整个项目,这将需要一段时间,所以要耐心等待)
8.键入:“mingw32-make install”(这将安装QWT在“C:\ QWT-6.1-RC3 \ qwtconfig.pri”设置的目录;默认位置是“C:/ QWT - $$ QWT_VERSION-RC3” - >“C:\ QWT-6.1.0-RC3 \”)
9.添加“C:\ QWT-6.1.0-RC3 \ LIB”你的系统路径变量
10.添加一个名为“QT_PLUGIN_PATH”用户变量具有以下路径:“C:\Qwt-6.1.0-rc3\plugins”
11.添加一个名为“QMAKEFEATURES”用户变量具有以下路径:“C:\Qwt-6.1.0-rc3\features”
12.启动Qt Creator的
13.创建一个新的项目:文件 - >新建文件或项目… - >应用程序 - > Qt的GUI应用程序 - >选择
14.将它命名为“测试”
15.在以下目录中创建项目:“C:\workspace”
16.打开文件“Test.pro”
17.添加“CONFIG += qwt”在底部
18.打开项目的main.c中并删除其所有内容。
19.粘贴在main.c中以下(这是QWT榜样“simpleplot”):

这样就能够在ui界面编辑中找到QwtWidgets包含的控件类了。当然打开ui是要选择以QT designed 才能够找到这些控件,如下图:
这里写图片描述
这里写图片描述
接着就是设计好ui界面了,如上图所示的界面,
添加源代码:
.pro文件

QT       += core gui
CONFIG += qwt
QT       +=serialport
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = temperature
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

.h文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMessageBox>
#include <QTimer>

#include <QDebug>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>

#include <qwt_plot_curve.h>
#include <qwt_legend.h>
#include <qwt_plot_item.h>
#include <qwt_legend_data.h>
#include <qwt_plot_grid.h>
#include <qwt_plot_panner.h>
#include <qwt_plot_picker.h>
#include <qwt_plot_magnifier.h>
#include <qwt_picker_machine.h>
#include <qwt_plot_zoomer.h>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
//    void timerEvent(QTimerEvent *);
    ~MainWindow();
private slots:
      void legendChecked(const QVariant &itemInfo,bool on);
      void OpenButtonClicked();
      void closeButtonClicked();
      void Read_Data();
      void clearButtonClicked();
      void timeoutslot();
private:
    Ui::MainWindow *ui;
    QSerialPort *serial;
//    QVector<double> xs;
//    QVector<double> ys;
};

#endif // MAINWINDOW_H

.cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"

QwtPlotCurve *curve = new QwtPlotCurve("temperature");
//定义一个QWtPlotCurve类的对象,curve  用来绘画曲线
//右边图例初始化,名字为“temperature”

//X轴
double time[20] = {};
//Y轴
double val[20] ={};
    int time_count;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
//    ui->temperplot->resize(640,400);
    setWindowFlags(Qt::WindowCloseButtonHint);//只显示一个关闭按钮
    //固定界面大小不可改变
    setMaximumSize(this->width(),this->height());
    setMinimumSize(this->width(),this->height());
    //设置图像显示标题
    ui->temperplot->setTitle("温度实时波形");
    //设置坐标轴名称
    ui->temperplot->setAxisTitle(QwtPlot::xBottom,"time   s");
    ui->temperplot->setAxisTitle(QwtPlot::yLeft,"temperature  ℃");

//    //设置坐标轴的范围
//    ui->temperplot->setAxisScale(QwtPlot::yLeft,0,50);
//    ui->temperplot->setAxisScale(QwtPlot::xBottom,0,5);
    //改变绘图区域的背景,canvas 表示画布
    ui->temperplot->canvas()->setPalette(QPalette(QColor(Qt::white)));
//    //使用滚轮放大缩小
//    (void) new QwtPlotMagnifier(ui->temperplot->canvas());
//    (void) new QwtPlotPanner(ui->temperplot->canvas());

    (new QwtPlotPanner(ui->temperplot->canvas()))->setMouseButton(Qt::RightButton);
    (new QwtPlotMagnifier(ui->temperplot->canvas()))->setAxisEnabled(QwtPlot::yLeft,false);
       //y轴在放大的时候,坐标不变化

    QwtPlotZoomer* zoomer = new QwtPlotZoomer(ui->temperplot->canvas());
    zoomer->setRubberBandPen(QColor(Qt::black));
    zoomer->setTrackerPen(QColor(Qt::black));
    zoomer->setMousePattern(QwtEventPattern::MouseSelect2,Qt::RightButton,Qt::ControlModifier);
    zoomer->setMousePattern(QwtEventPattern::MouseSelect3,Qt::RightButton);
    //实现鼠标左键选择区域放大:(右键还原)功能。

    //定义一个选择器,(十字架),以xBottom 和yLeft为坐标显示
    QwtPlotPicker *picker;
    picker = new QwtPlotPicker(QwtPlot::xBottom,QwtPlot::yLeft,QwtPlotPicker::CrossRubberBand,QwtPicker::AlwaysOn,ui->temperplot->canvas());
    picker->setStateMachine(new QwtPickerDragPointMachine());//拖拽点起作用
    picker->setRubberBandPen(QPen(QColor(Qt::white)));//拖拽点颜色
    picker->setTrackerPen(QColor(Qt::blue));//跟踪器 显示对应坐标的颜色

    QwtLegend *legend = new QwtLegend;//legend(图例)
    legend->setDefaultItemMode(QwtLegendData::Checkable);//图例可选择
    ui->temperplot->insertLegend(legend,QwtPlot::RightLegend);//图例插入到plot绘画中。

    QwtPlotGrid *grid = new QwtPlotGrid;//grid 格子,网格
    grid->enableXMin(true);
    grid->setMajorPen(QPen(Qt::red, 0, Qt::DotLine));//大格子
    grid->setMinorPen(QPen(Qt::red, 0 , Qt::DotLine));//大格子里的小格子
    grid->attach(ui->temperplot);//加载到plot中

    setAutoFillBackground(true);//自动填充背景颜色
    curve->setPen(QPen(Qt::red));
    curve->setSamples(time,val,20);//加载数据,也可以使用setData
//    curve->setSamples(xs,ys);
    curve->setCurveAttribute(QwtPlotCurve::Fitted,true);//是曲线更圆滑
    curve->attach(ui->temperplot);//加载到plot绘画上

    //连接槽,处理对应事件
    connect(legend,SIGNAL(checked(const QVariant &,bool,int)),this,SLOT(legendChecked(const QVariant &,bool)));

    /*串口部分*/
    /*查找可用串口,调用foreach 串口信息保存在info 中*/
    foreach (const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
    {
        qDebug() <<"Name   :" <<info.portName();
        qDebug() <<"Description" <<info.description();
        qDebug() <<"Manufacturer"<<info.manufacturer();

        QSerialPort serial;
        serial.setPort(info);//设置串口端口
        if(serial.open(QIODevice::ReadWrite))//可读可写方式打开串口
        {
            ui->portBox->addItem(serial.portName());//将检测到的串口信息放到Box中显示
            serial.close();
        }
    }
    ui->closeButton->setEnabled(false);//关闭按钮不可用
    ui->clearButtom->setEnabled(false);//清空数据按钮不可以
    qDebug() <<tr("界面设定成功");
    connect(ui->openButton,SIGNAL(clicked()),this,SLOT(OpenButtonClicked()));
    connect(ui->closeButton,SIGNAL(clicked()),this,SLOT(closeButtonClicked()));
    connect(ui->clearButtom,SIGNAL(clicked()),this,SLOT(clearButtonClicked()));
}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::legendChecked(const QVariant &itemInfo,bool on)
{
    //获得曲线
    QwtPlotItem *plotItem = ui->temperplot->infoToItem(itemInfo);
    if(plotItem)
    {
        plotItem->setVisible(on);
    }
    ui->temperplot->replot();//重新加载曲线
}

//打开串口槽函数
void MainWindow::OpenButtonClicked()
{

    if(ui->portBox->currentText() == NULL)
    {
        QMessageBox::information(this,"Error Message","Open port Error");
    }
    else
    {
        ui->openButton->setEnabled(false);
        ui->clearButtom->setEnabled(true);
        ui->closeButton->setEnabled(true);//使能关闭串口
        //设置各个组合框不可用
        ui->portBox->setEnabled(false);
        ui->dataBox->setEnabled(false);
        ui->checkBox->setEnabled(false);
        ui->stopBox->setEnabled(false);
        ui->baudrateBox->setEnabled(false);

       serial = new QSerialPort;

       //设置端口名com x; 这两句的顺序不能够变,否则会出错。
       serial->setPortName(ui->portBox->currentText());
       //打开串口
       serial->open(QIODevice::ReadWrite);
       //设置波特率
//       serial->setBaudRate(ui->baudrateBox->currentText().toInt());
       if(ui->baudrateBox->currentText()==tr("9600")) //根据组合框内容对串口进行设置
           serial->setBaudRate(QSerialPort::Baud9600);
           else if(ui->baudrateBox->currentText()==tr("115200"))
           serial->setBaudRate(QSerialPort::Baud115200);
       //设置数据位
       switch(ui->dataBox->currentIndex())
       {
            case 8:serial->setDataBits(QSerialPort::Data8);
                    break;
            case 7:serial->setDataBits(QSerialPort::Data7);
                    break;
            default :
                    break;
       }
       //设置校验位
       switch (ui->checkBox->currentIndex())
       {
            case 0:serial->setParity(QSerialPort::NoParity);
                break;
            default:
                break;
       }
       //设置停止位
       switch (ui->stopBox->currentIndex())
       {
            case 1:serial->setStopBits(QSerialPort::OneStop);
                break;
            default:
            break;
       }
       //设置流控制
       serial->setFlowControl(QSerialPort::NoFlowControl);
        //连接槽函数,当串口有数据到来时,回调函数。
        connect(serial,SIGNAL(readyRead()),this,SLOT(Read_Data()));

        QTimer *timer_clock = new QTimer(this);
        connect(timer_clock,SIGNAL(timeout()),this,SLOT(timeoutslot()));
        timer_clock->start(100);//200ms

    }
}

void MainWindow::closeButtonClicked()
{
    ui->openButton->setEnabled(true);
    ui->closeButton->setEnabled(false);
    ui->clearButtom->setEnabled(false);

    //设置各个组合框可以
    ui->portBox->setEnabled(true);
    ui->dataBox->setEnabled(true);
    ui->checkBox->setEnabled(true);
    ui->stopBox->setEnabled(true);
    ui->baudrateBox->setEnabled(true);

    serial->clear();
    serial->close();
    serial->deleteLater();

}

void MainWindow::Read_Data()//进去这个函数是,只要串口中有数据,就会进入这个函数。
{
    QByteArray buf;//QByteArray 类是定义一个字节数组(char *),
    buf = serial->readAll();//读取串口所有的数据给变量buf
    if(buf != NULL)
    {
        QString str = ui->receiveEdit->toPlainText();//获取TextEdit的内容

        for (int i = 0; i < 19; i++)
        {
            val[i] = val[i+1];
        }
        //最后一位为新数据
        val[19] =buf.toDouble();
        curve->setSamples(time,  val, 20);//重新加载数据
//        ys.append(buf.toDouble());
//        curve->setSamples(xs,ys);
        ui->temperplot->replot(); //QwtPlot重绘,重要,没有这句不起作用

        str = tr(buf);//将接收区之前的数据+串口缓冲区的数据
        QString str1,str2;
        str1 = str+tr("℃ ");
        str2 = QString::number(time_count*100);//int --> Qstring
        str1 += str2+tr("ms");
     //   ui->receiveEdit->clear();
        ui->receiveEdit->append(str1);//把文本str添加到文本编辑的结尾
    }
    buf.clear();
}


void MainWindow::clearButtonClicked()
{
    ui->receiveEdit->clear();
    memset(time,0,20);
    memset(val,0,20);
    time_count = 0;
}

//定时100ms一到,回调这个函数
void MainWindow::timeoutslot()
{
    time_count++;
    for(int i = 0;i < 19;i++)
    {
        time[i]=time[i+1];
    }
    time[19] = time_count;
}

版权所有,转发请注明出处:
http://blog.csdn.net/qq_33559992/article/details/52238116

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

基于QT:温度串口图像显示 的相关文章

  • Qt程序部署到多平台,如何?

    我是 Qt 编程新手 我想开发一个程序 我想在 Windows Linux ubuntu 和 Mac 上运行 听说Qt支持多平台应用程序开发 但我的问题是 在我部署或编译后 任何 Qt 库都需要在 Ubuntu 中运行这个应用程序吗 如果您
  • 如何在 C++ 和 QML 应用程序中使用 qrc?

    我在 Windows7 上用 c qnd Qt Creator QML 编写了 Qt Quick Desktop 应用程序 现在 我必须部署它 并且我需要隐藏 qml 文件和图像 意味着 将它们放入资源等中 我读到有一个很好的方法可以使用
  • Qt:将拖放委托给子级的最佳方式

    我在 QWidget 上使用拖放 我重新实现了 DragEnterEvent dragLeaveEvent dragMoveEvent 和 dropEvent 效果很好 在我的 QWidget 中 我有其他 QWidget 子级 我希望它们
  • Qt - 如何粘合两个窗口并将它们移动在一起?

    就像qmmp Qt 音乐播放器ui设计一样 这两个或三个窗口实际上在同一个窗口中 因为只有一个dock图标 并且这些窗口可以一起移动并相互附着 我看了源码 好像有用QDockWidget 但我真的不知道如何获得它的细节 当您手动移动辅助窗口
  • QTextEdit.find() 在 Python 中不起作用

    演示问题的简单代码 usr bin env python import sys from PyQt4 QtCore import QObject SIGNAL from PyQt4 QtGui import QApplication QTe
  • 如何在模型更改时停止ListView“跳跃”

    我需要做什么 我需要创建一个聊天窗口用一个ListView在 QML 中存储聊天消息 我设置listView positionViewAtEnd 以便跟踪最后的消息 我禁用positionViewAtEnd当我向上滚动时 我可以阅读过去的消
  • 加权 Voronoi 的 CGAL 2D APOLLONIUS 图 - 如何生成和获取面和顶点?

    我正在尝试根据阿波罗尼乌斯图生成加权沃罗诺伊 我正在使用 CGAL 库 我找不到如何从 apollonius 获取面和顶点的好例子 我有以下类型定义 typedef double NT typedef CGAL Cartesian lt N
  • 从布局中按名称获取小部件

    如果我想从 python Qt 的布局中获取特定的小部件 我应该如何进行 到目前为止我所做的 for i in range self ui horizontalLayout 14 count here it does fail name s
  • 在 Qt5 中,是否需要 Q_INVOKABLE 来从 QML 调用公共 QObject 函数?

    我刚刚意识到我可以调用暴露于 QML 的对象的几乎任何函数 现在我对 Q INVOKABLE 很好奇 Qt5docs http doc qt io qt 5 qtqml cppintegration exposecppattributes
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • 如何将图像显示为缩略图

    我有一个QTreeView显示硬盘驱动器和目录 我也有一个QListView显示图像文件如下 但我想将图像显示为缩略图 如下所示 My code mainWidget mainWidget QWidget parent QWidget pa
  • 为 Windows 98 编译 Qt

    我需要支持 Windows 98 Qt 文档声称这是可能的 但没有说明 Qt 4 6 的分布式二进制文件不能在 Win98 上运行 而且我采样的大多数 Qt 应用程序也不能在 Win98 上运行 对于几个确实在 98 上运行的应用程序 我询
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • 退出 Qt 程序的正确方法?

    我应该如何退出 Qt 程序 例如在加载数据文件时 发现文件损坏 并且用户需要退出该应用程序或重新启动数据文件 我是不是该 call exit EXIT FAILURE call QApplication quit call QCoreApp
  • Qt:如何连接到 SQLite?

    我安装了 SQLite3 解压到 c sqlite 创建了一个数据库 c sqlite mzsales 现在我试图在 QTableView 中显示其内容 QSqlDatabase db QSqlDatabase addDatabase QS
  • 从 Qt4 中的文本文件中逐字读取

    我想在 Qt4 中逐字读取一个文本文件 说实话我对它很陌生 我想在另一个文件中每行一个字写入 我可以在 C 中做到这一点 没有任何问题 但是当我尝试在 Qt4 中使用 ifstream 和 ofstream 时 我遇到了错误 这是我的 Qt
  • Qt 是否已经有了自己的 new 和 delete 运算符?

    我正在使用一个QGraphicsScene小部件并在其上显示一些点QGraphicsRectItem 这意味着要拨打很多电话new addItem 当出现时 并且removeItem delete摆脱未使用的点 当然 对于性能问题 我已经实
  • QML 连接:不推荐使用连接中隐式定义的 onFoo 属性

    升级到 Qt 5 15 时收到以下错误消息 QML Connections Implicitly defined onFoo properties in Connections are deprecated Use this syntax
  • Mac 上的 Qt — 如何访问帮助菜单中的“搜索”

    我正在将我的 Qt 应用程序移植到 Mac OS X 在 Windows Linux 上 我使用 QLineEdit 在帮助菜单中提供搜索功能 In Mac OS X I saw something like this is built i
  • 如何访问Loader的sourceComponent中的QML对象?

    我可能需要读取或写入的一些属性Loader s sourceComponent来自一些外部函数 访问该房产的方式是什么x里面的对象的Loader s sourceComponent import QtQuick 2 0 Item width

随机推荐

  • python文件操作图形化——python实战项目:单词练习系统

    python 文件操作与图形化编程 目录 python 文件操作与图形化编程 文件基本操作 图形化界面tkinter 单词练习系统 文件基本操作 D Python example txt 文件路径 D Python 文件名 example
  • 并行计算出现 pickle.PicklingError

    from multiprocessing import Pool def my function x return x x if name main inputs 1 2 3 4 5 with Pool 2 as p results p m
  • Unity面试题

    Unity基础面试题 1 什么是协同程序 2 Unity3D中碰撞器和触发器的区别 3 物体发生碰撞的必要条件 4 ArrayList和list的区别 5 如何安全的在不同工程间迁移Asset 6 OnEnable Awake Start的
  • Dubbo高级应用-服务治理

    目录 1 dubbo admin 2 7 x版本安装部署 1 1 下载源码 1 2 部署访问 2 路由规则 2 1 Dubbo API配置 2 2 管理控制台配置 3 规则动态配置 3 1 应用粒度 3 2 服务粒度 4 服务降级 5 集群
  • 集成 CUDA 实现 GPU 加速 OpenCV 计算机视觉

    特点 详细概述了将 OpenCV 与 CUDA 集成以用于实际应用 理解GPU与CUDA编程 通过一些实际示例 探索使用GPU和CUDA的OpenCV加速 熟悉在 NVIDIA Jetson TX1 上部署 OpenCV 应用程序 介绍了
  • python 类装饰器和函数装饰器区别_Python各种类型装饰器详解说明

    装饰器说明 Python中的装饰器是一种可以装饰其它对象的工具 该工具本质上是一个可调用的对象 callable 所以装饰器一般可以由函数 类来实现 装饰器本身需要接受一个被装饰的对象作为参数 该参数通常为函数 方法 类等对象 装饰器需要返
  • -day15--内置模块与开发规范

    day15 内置模块和开发规范 目标 掌握常见的内置模块的使用及了解软件开发的规范 今日概要 内置模块 json time datetime re 开发规范 主文件 配置文件 数据 附件 业务代码 1 内置模块 1 1 json json模
  • Win10+mingw64条件下编译和使用TBB(环境变量太神奇了!)

    Win10 mingw64 VSCode条件下编译和使用TBB Win10 mingw64条件下编译和使用TBB 编译TBB 环境变量的设置 TBB使用示例 总结与展望 Win10 mingw64条件下编译和使用TBB 本文记录在Win10
  • java中.xlsx或者.xls格式的Excel导入(servlet中处理的)

    1 第一步 在pom xml文件中添加maven依赖
  • 二、Node.js---模块化

    目录 模块化的基本概念 Node js中模块化 Node js 中模块的分类 加载模块 Node js 中的模块作用域 模块作用域 向外共享模块作用域中的成员 Node js 中的模块化规范 npm与包 在项目中安装包 包的语义化版本规范
  • 运放-滞回(迟滞)比较器全流程实战计算

    比较器之滞回 迟滞 比较器实战计算 下面我们进行一个电池低电压保护的电路设计 其中会介绍到滞回比较器的实际用法以及详细计算推导过程 假设我们定18 5V为电池欠压保护电压 也就是说在当前负载情况下电池电压低于18 5V时 其他功能会被限制住
  • linux中如何重新configure(或去除已configure的文件)

    linux中如何重新configure 或去除已configure的文件 linux中 在安装源码软件前 需要configure命令来进行安装配置 有时configure后需要重新configure 这时需要进行一些操作 已放置出错 以在f
  • 如何使用C ++以编程方式在Word文档中使用注释?

    Microsoft Word使您能够向Word文档添加注释 在诸如建议改进文档或共享文本思想等情况下 注释可能会有所帮助 在某些情况下 需要以编程方式管理评论 为此 本文将教您如何使用C 在Word文档中使用注释 让我们探索以下有关的内容
  • 12306验证码识别

    1 安装tesseract https digi bib uni mannheim de tesseract 安装时安装语言包 不过我安装了好多次都没成功 好像是被墙了 所以语言包使用https github com tesseract o
  • Linux驱动入门(1)hello驱动

    前言 1 学习韦东山老师的Linux 因为他讲的很精简 以至于很多人听不懂 接下来我讲介绍韦东山老师的驱动实验班的第一个Hello程序 2 注意 请先学习完视频再来看这个教程 本文仅供入门学习 如需深入 请搜索其他博客 3 gitee仓库
  • osgEarth的Rex引擎原理分析(七十七)rex引擎中绘制瓦片的调度过程原理

    目标 七十二 中的问题151 主要是分析瓦片什么时候进入场景树 什么时候从场景树中移出 1 初始化 osgEarthDrivers engine rex RexTerrainEngineNode cpp void RexTerrainEng
  • Git 常见错误 之 fatal: Authentication failed 简单解决方法

    Git 常见错误 之 fatal Authentication failed 简单解决方法 目录 Git 常见错误 之 fatal Authentication failed 简单解决方法 一 简单介绍 二 问题现象 三 解决方法 1 修改
  • ADS1115(ADC)16 位分辨率的高精度模数转换器的操作步骤

    ADS1113 ADS1114 和ADS1115 是具有16 位分辨率的高精度模数转换器 ADC 采用超小型的无引线QFN 10 封装或MSOP 10 封装 ADS1113 4 5 在设计时考虑到了精度 功耗和实现的简易性 ADS1113
  • Java的反射技术(Class类,Constructor类,Method类, Field类)

    Java编码时知道类和对象的具体信息 此时直接对类和对象进行操作即可 无需反射 如果编码时不知道类或者对象的具体信息 此时应该使用反射来实现 为什么要使用反射 反射就是把Java类中的各种成分映射成一个个的java对象 例如 一个类有 成员
  • 基于QT:温度串口图像显示

    用Qt自己写一个上位机 将串口发过来的温度信息 显示出来 并且绘画出温度曲线 上图 采用QT绘画曲线 首先当然是采用 qwt控件 而Qt没有自带的qwt控件 所以需要按住移植qwt控件方法具体步骤如下 1 Download and inst