QT网络编程TCP/UDP开发流程 制作网络调试助手

2023-05-16

目录标题

    • 一、开发基础知识
      • 1、QT的网络编程: TCP和UDP
      • 2、网络编程接口
        • 1. listen
        • 2. connect
    • 二、TCP编程
      • 1、TCP服务端实现流程
      • 2、TCP客户端实现流程
    • 三、UDP编程
    • 四、源码
      • 1. TCP服务端
      • 2. TCP客户端
      • 3. UDP

一、开发基础知识

1、QT的网络编程: TCP和UDP

TCP编程需要用到俩个类: QTcpServer 和 QTcpSocket

QTcpSocket类提供了一个TCP套接字

  1. QTcpSocket是QAbstractSocket的一个子类,它允许您建立TCP连接和传输数据流
    注意:TCP套接字不能在QIODevice::Unbuffered模式下打开。

QTcpServer类提供一个基于tcp的服务器
2. 这个类可以接收传入的TCP连接。您可以指定端口或让QTcpServer自动选择一个端口。你可以监听一个特定的地址或所有机器的地址。
3. 调用listen()让服务器侦听传入的连接。然后,每当客户机连接到服务器时,都会发出newConnection()信号。
4. 调用nextPendingConnection()接受挂起的连接作为已连接的QTcpSocket。该函数返回一个指向QAbstractSocket::ConnectedState中的QTcpSocket的指针,您可以使用该指针

2、网络编程接口

1. listen

功能:设置监听数和分配端口,监听客户端连接

bool QTcpServer::listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)

如果address为QHostAddress::Any,服务器将侦听所有网络接口;
为QHostAddress::LocalHost,IPv4本地主机地址,相当于QHostAddress(“127.0.0.1”)
当“port”为“0”时,系统自动分配端口
成功 true;失败 false

2. connect

功能:connect,是QT中的连接函数,将信号发送者sender对象中的信号signal与接受者receiver中的member槽函数联系起来。当指定信号signal时必须使用宏SIGNAL () ,当指定槽函数时必须使用宏SLOT()

connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, const QObject *context,	 
	Func2 slot, Qt::ConnectionType type = Qt::AutoConnection)

二、TCP编程

目标创建一个TCP服务端和一个TCP 客户端简单网络调试助手

1、TCP服务端实现流程

1. 创建项目

创建一个Qt Widgets Application项目项目名称和位置都不要包含中文基类选择QWidget

2. UI设计

接收窗口使用 QPlainTextEdit 并修改为只读
发送窗口使用 Line Edit

3. .h文件中包含头文件

#include <QTcpServer>
#include <QTcpSocket>

4. qmake文件中添加network

QT       += core gui network

5. Widget类构造函数中创建QTcpServer和QTcpSocket的对象用作监听套接字

tcpServer = new QTcpServer(this);
tcpSocket = new QTcpSocket(this);

tcpServer 和 tcpSocket 对象指针需要在Widget类中声明

QTcpServer *tcpServer;  
QTcpSocket *tcpSocket;

6. 使用listen()方法监听网卡的ip和端口(打开服务器)
侦听IPv4和IPv6接口,端口为portEdit输入的内容

void Widget::on_openBt_clicked()
{
    tcpServer->listen(QHostAddress::Any, ui->portEdit->text().toUInt());
}

7. 如果有新的连接过来,并且连接成功,服务器会触发newConnection()信号,通过槽函数取出连接成功的socket

connect(tcpServer, SIGNAL(newConnection()), this, SLOT(newConnection_Slot())); //连接请求到来,触发newConnection信号,并回调槽函数

void Widget::newConnection_Slot()
{
    while (tcpServer->hasPendingConnections()) //有待连接请求
    {
        tcpSocket = tcpServer->nextPendingConnection();	//连接并返回套接字
        connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readyRead_Slot())); //套接字有数据到来触发信号readyRead(),回调槽函数
    }
}

8. 如果有数据成功传送过来,对方的通信套接字QTcpSocket会触发readyRead()信号,在槽函数可以进行读取

void Widget::readyRead_Slot()
{
    QString buf = tcpSocket->readAll();	//读数据
    ui->recvEdit->appendPlainText(buf);	//追加显示
}

9. 发送数据

void Widget::on_sendBt_clicked()
{
    tcpSocket->write(ui->sendEdit->text().toLocal8Bit().data());
}

10. 关闭套接字(关闭服务器)

void Widget::on_closeButton_clicked()
{
    tcpSocket->close();
}

2、TCP客户端实现流程

1. 创建项目
基类选择QWidget
2. UI设计

3. .h文件中包含头文件

#include <QTcpServer>
#include <QTcpSocket>

4. qmake文件中添加network

QT       += core gui network

5. Widget类构造函数中创建QTcpSocket的对象用作监听套接字

tcpSocket = new QTcpSocket(this);

tcpSocket 对象指针需要在Widget类中声明

QTcpSocket *tcpSocket;

6. connectTohost()绑定ip和端口号进行连接,连接成功会触发connected()信号,将该信号与槽函数关联

void Widget::on_openBt_clicked()
{
    tcpSocket->connectToHost(ui->ipEdit->text(), ui->portEdit->text().toUInt());
    connect(tcpSocket, SIGNAL(connected()), this, SLOT(connected_Slot()));
}

7. readyRead()信号和槽函数关联

void Widget::connected_Slot()
{
    connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readyRead_Slot()));
}

8. 读数据

void Widget::readyRead_Slot()
{
    QString buf = tcpSocket->readAll();
    ui->recvEdit->appendPlainText(buf);
}

9. 发送数据

void Widget::on_sendBt_clicked()
{
    tcpSocket->write(ui->sendEdit->text().toLocal8Bit());
}

10. 关闭套接字

void Widget::on_sendBt_clicked()
{
    tcpSocket->write(ui->sendEdit->text().toLocal8Bit());
}

三、UDP编程

udp通信这里不分服务端和客户端

1. 创建项目
基类选择QWidget
2. UI设计

3. .h文件中包含头文件

#include <QUdpSocket>

4. qmake文件中添加network

QT       += core gui network

5. Widget类构造函数中创建QTcpSocket的对象用作监听套接字

udpSocket = new QUdpSocket(this); //获取套接字

udpsocket对象指针需要在Widget类中声明

QUdpSocket *udpSocket;

6. bind()设置本地端口号,准备读信号与槽函数关联(打开udp连接)

void Widget::on_openBt_clicked()
{
    udpSocket->bind(ui->localPort->text().toUInt());  //绑定本地端口

    connect(udpSocket, SIGNAL(readyRead()), this, SLOT(readyRead_slot()));  //准备读信号与槽函数关联
}

7. 读数据

void Widget::readyRead_slot()
{
    while(udpSocket->hasPendingDatagrams()) {   //udp与tcp不同,udp需要判断数据是否读完
        QByteArray array;
        array.resize(udpSocket->pendingDatagramSize()); //调整array数组大小与数据报大小一致
        udpSocket->readDatagram(array.data(), array.size()); //读取数据报到array.data中、

        QString buf = array.data(); //将数据类型转换成string类型
        ui->recvEdit->appendPlainText(buf); //将数据显示到接收窗口
    }
}

8. 发送数据

void Widget::on_sendBt_clicked()
{
    QHostAddress address;

    address.setAddress(ui->aimIp->text());
    udpSocket->writeDatagram(ui->sendEdit->text().toLocal8Bit().data(), //发送内容 const char *
                             ui->sendEdit->text().length(), //内容长度 qint64
                             address, //目标IP const QHostAddress &
                             ui->aimPort->text().toUInt()); //目标端口 quint16
}
  1. 关闭套接字
udpSocket->close();

四、源码

1. TCP服务端

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <QString>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

    QTcpServer *tcpServer;  //声明套接字
    QTcpSocket *tcpSocket;

private slots:  //槽函数声明
    void newConnection_Slot();
    void readyRead_Slot();
    void on_openBt_clicked();
    void on_closeButton_clicked();
    void on_sendBt_clicked();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    tcpServer = new QTcpServer(this);   //获取套接字
    tcpSocket = new QTcpSocket(this);

    connect(tcpServer, SIGNAL(newConnection()), this, SLOT(newConnection_Slot())); //新连接请求信号与连接槽函数关联
}

void Widget::newConnection_Slot()
{
    while (tcpServer->hasPendingConnections())  //有待连接请求
    {
        tcpSocket = tcpServer->nextPendingConnection(); //连接并返回套接字
        connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readyRead_Slot())); //读准备信号与读槽函数关联
    }
}

void Widget::readyRead_Slot()   //读取数据并显示到接收窗口
{
    QString buf = tcpSocket->readAll();
    ui->recvEdit->appendPlainText(buf);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_openBt_clicked()   //打开服务器
{
    tcpServer->listen(QHostAddress::Any, ui->portEdit->text().toUInt()); //监听接口,设计端口号
}

void Widget::on_closeButton_clicked()   //关闭套接字
{
    tcpSocket->close();
}

void Widget::on_sendBt_clicked()   //发送数据
{
    tcpSocket->write(ui->sendEdit->text().toLocal8Bit().data());
}

2. TCP客户端

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpSocket>
#include <QString>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);

    QTcpSocket *tcpSocket;

    ~Widget();

private slots:
    void connected_Slot();
    void readyRead_Slot();
    void on_closeBt_clicked();
    void on_sendBt_clicked();
    void on_openBt_clicked();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    tcpSocket = new QTcpSocket(this);	//获取套接字
}

Widget::~Widget()
{
    delete ui;
}

void Widget::connected_Slot()
{
    connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readyRead_Slot()));	//读准备信号关联槽函数
}

void Widget::readyRead_Slot()	//读数据
{
    QString buf = tcpSocket->readAll();
    ui->recvEdit->appendPlainText(buf);
}

void Widget::on_sendBt_clicked()	//发送数据
{
    tcpSocket->write(ui->sendEdit->text().toLocal8Bit());
}

void Widget::on_closeBt_clicked()	//关闭套接字
{
    tcpSocket->close();
}

void Widget::on_openBt_clicked()	//连接服务器,连接成功信号和槽函数关联
{
    tcpSocket->connectToHost(ui->ipEdit->text(), ui->portEdit->text().toUInt());
    connect(tcpSocket, SIGNAL(connected()), this, SLOT(connected_Slot()));  //可替换如下
    //connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readyRead_Slot()));
}

3. UDP

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QUdpSocket>
#include <QString>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

    QUdpSocket *udpSocket;

private slots:
    void on_openBt_clicked();
    void readyRead_slot();
    void on_sendBt_clicked();
    void on_closeBt_clicked();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    udpSocket = new QUdpSocket(this); //获取套接字
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_openBt_clicked()
{
    udpSocket->bind(ui->localPort->text().toUInt());  //绑定本地端口

    connect(udpSocket, SIGNAL(readyRead()), this, SLOT(readyRead_slot()));  //准备读信号与槽函数关联
}

void Widget::readyRead_slot()
{
    while(udpSocket->hasPendingDatagrams()) {   //udp与tcp不同,udp需要判断数据是否读完
        QByteArray array;
        array.resize(udpSocket->pendingDatagramSize()); //调整array数组大小与数据报大小一致
        udpSocket->readDatagram(array.data(), array.size()); //读取数据报到array.data中、

        QString buf = array.data(); //将数据类型转换成string类型
        ui->recvEdit->appendPlainText(buf); //将数据显示到接收窗口
    }
}

void Widget::on_sendBt_clicked()
{
    QHostAddress address;

    address.setAddress(ui->aimIp->text());
    udpSocket->writeDatagram(ui->sendEdit->text().toLocal8Bit().data(), //发送内容 const char *
                             ui->sendEdit->text().length(), //内容长度 qint64
                             address, //目标IP const QHostAddress &
                             ui->aimPort->text().toUInt()); //目标端口 quint16
}

void Widget::on_closeBt_clicked()
{
    udpSocket->close(); //关闭套接字
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT网络编程TCP/UDP开发流程 制作网络调试助手 的相关文章

  • Spring整合JMS(一)——基于ActiveMQ实现

    1 1 JMS简介 JMS的全称是Java Message Service xff0c 即Java消息服务 它主要用于在生产者和消费者之间进行消息传递 xff0c 生产者负责产生消息 xff0c 而消费者负责接收消息 把它应用到实际的业务需
  • getopt函数详解

    getopt 函数是C语言中一个常用的命令行参数解析函数 xff0c 它可以方便地解析命令行输入的参数 xff0c 以便程序对不同参数进行不同的处理 本文将详细讲解getopt 函数的使用方法和注意事项 xff0c 分点阐述如下 xff1a
  • UCOSIII

    UCOSIII简介 xff1a UCOSIII是MicroC OS III的改编版本 xff0c 主要是用于实时系统中的任务调度 xff0c 它是嵌入式系统中应用最广泛的操作系统之一 用函数说明 xff1a 1 OSInit 用于初始化UC
  • UCOSIII-任务创建-库函数

    创建任务 xff1a OSTaskCreate OS TCB amp StartTaskTCB 任务控制块 xff08 amp 传地址 xff09 CPU CHAR 34 start task 34 任务名字 xff08 可以随便写 xff
  • ucosiii-常用api

    uC OS III 提供了许多 API 函数 xff0c 可以根据需要选择使用 以下是一些常用的 uC OS III API 函数 xff1a 任务管理 API OSTaskCreate xff1a 创建一个新任务 xff1b OSTask
  • windows 清除 .git 文件夹

    有时我们需要将 git 管理项目中的 git文件夹删除 xff0c 但是如果项目太多 xff0c 一个一个手动删除太麻烦 xff0c 这时候可以用 bat 批处理文件删除 xff0c 具体操作如下 桌面 右击 新建文本文档 xff0c 此时
  • Your anti-virus program might be impacting your build performance.解决方案

    Your anti virus program might be impacting your build performance 解决方案 在使用 AndroidStudio 时 xff0c 经常会弹出框提示 xff1a Your ant
  • init.rc 启动 shell 脚本 开机执行脚本 init.rc执行shell脚本

    Android 重启时执行 shell 脚本 init rc 执行 shell 脚本 最近有个需求 xff0c 需要生成系统的默认配置 xff0c 使得在系统开机后 xff0c 直接读取已经配置好的文件 当时想的解决方案是 xff0c 在编
  • android 10 自定义系统服务接口给app调用

    Android 安卓自定义系统服务 最近有个需求 xff0c 要增加系统服务 xff0c 生成第三方 jar 包提供给第三方应用调用 xff0c 而且 jar 包必须用特定的包名 xff0c 最后生成的 jar 包不能包含 framewor
  • Android java.lang.NoSuchMethodError: No virtual method ;or its super classes (declaration of

    修改 AOSP 源码后调用错误 java lang NoSuchMethodError No virtual method in class or its super classes declaration of appears in sy
  • 谷歌使用技巧 20 招

    第一招 xff1a 使用搜索栏下方的 Tab 栏 xff0c 可以快速搜索 视频 图片 新闻第二招 xff1a 使用引号 xff0c 默认搜索会去搜索包含输入关键字的结果 xff0c 用 34 holy shit 34 会去进行整句搜索第三
  • 索引算法原理解析(B-tree以及磁盘存储原理)

    刚开始学习的时候 xff0c 百度去查 xff0c 但发现好多说得太复杂不好理解 xff0c 结合各个文章总结一下 xff08 建议大概看文字 xff0c 不理解不要紧 xff0c 然后再看图的执行步骤然后在结合文字 xff0c 这样一切就
  • C语言-----结构体内存对齐

    结构体内存对齐规则 xff1a 第一个成员在结构体变量偏移量为0 的地址处 其他成员变量要对齐到某个数字 xff08 对齐数 xff09 的整数倍的地址处 对齐数 61 编译器默认的一个对齐数与该成员大小中的较小值 vs中默认值是8 Lin
  • dpi计算 density 取值范围

    PPI DPI计算公式 Density 61 sqrt span class token punctuation span span class token punctuation span span class token car wp
  • Repo 流程

    First repo init creates the repo directory clones the git repository https android googlesource com tools repo to repo r
  • *** buffer overflow detected ***: terminatedAborted (core dumped)解决

    在执行一个程序的时候出现了下面的这个错误 xff0c 明明在Ubuntu下面已经编译好了 xff0c 执行的时候除了问题 xff0c 于是换了台电脑尝试还是一样 buffer overflow detected terminated Abo
  • 虚拟机Ubuntu远程启动Jetson nano RVIZ图形界面失败

    INFO 1644470251 178517 Rosapi started map manager 6 process has finished cleanly log file home jetson ros log fb3115c6 8
  • YOLOv5训练自己的数据集实现视频的识别

    写在前面 我本来是使用这个模型进行手写签名的定位 xff0c 但是因为比赛的主办方原因 xff0c 数据不允许公开 xff0c 所以我使用动物世界的一段开头视屏来制作我的数据集 这整个模型跑通的过程中 xff0c 我参考了很多不错的博客 x
  • stm32---OLED(SSD1306)

    OLED模块优缺点 优点 xff1a 尺寸小 xff0c 分辨率高 xff0c 低压3 3V就可工作 xff0c 支持多种接口方式 xff0c 该模块提供了总共4种接口包括 xff1a 6800 8080两种并行接口方式 4线的穿行SPI接
  • stm32---ADC模数转换

    ADC xff1a 模数转换器 xff0c 将模拟信号 xff08 0v xff0c 3v xff0c 6v等 xff09 转换为表示一定比例电压值的数字信号 xff08 1 xff0c 2 xff0c 3等 xff09 STM32F10x

随机推荐

  • stm32---DMA

    DMA 全称Direct Memory Access xff08 直接存储器访问 xff09 xff0c 把一个地址空间的值 复制 到另一个地址空间 xff0c 使用DMA传输方式无需CPU直接控制传输 xff0c 通过硬件为RAM和IO设
  • STM32通信---CAN

    一 CAN是什么 xff1f CAN xff0c 全称为 Controller Area Network xff0c 即控制器局域网 xff0c 是一种多主方式的串行通讯总线 xff0c 是国际上应用最广泛的现场总线之一 二 CAN的起源
  • 计算机网络学习笔记3-抓包工具的使用

    Wireshark win64 2 6 2的使用 安装一路next 在发送数据之前 运行抓包工具 当数据发送之后 记得停止抓包
  • linux运行java项目的shell脚本

    bin bash WORKDIR 61 home xiaohong Baowen cd WORKDIR WEB INF classes for file in 96 ls WORKDIR WEB INF lib jar 96 do CLAS
  • 基于STM32F103的智能门禁系统

    0 前言 本人大二软工菜鸟一枚 xff0c 大神不喜勿喷 1 功能演示 点这里功能演示 2 硬件选型 序号名称备注1STM32F103C8T6开发板用于主控2AS608指纹模块指纹解锁3RFID RC522射频模块刷卡解锁40 96寸四针O
  • uboot的环境变量相关源码分析

    一 uboot的环境变量基础 1 1 环境变量的作用 1 让我们可以不用修改uboot的源代码 xff0c 而是通过修改环境变量就可以影响uboot运行时的一些特性 譬如说修改bootdelay环境变量就可以更改系统开机自动启动时倒计时的秒
  • uboot移植Linux-SD驱动代码解析

    一 uboot与linux驱动 1 1 uboot本身是裸机程序 1 狭义的驱动概念是指 xff1a 操作系统中用来具体操控硬件的代码叫驱动 广义的驱动概念是指 xff1a 凡是操控硬件的代码都叫驱动 2 裸机程序中是直接使用寄存器的物理地
  • 移植三星官方的uboot到x210

    1 移植前的准备工作 1 1 三星移植过的uboot源代码准备 1 三星对于S5PV210的官方开发板为SMDKV210 xff0c 对应移植的 uboot smdkv210 tar bz2 1 2 SourceInsight准备 1 移植
  • 4g模块与51单片机通信

    本文硬件选自忆佰特的4g模块和老陈的上官一号 第一步先使用电脑配置4g模块 xff0c 配置好后再与51单片机进行接线完成通信 xff0c 需要提前插入SIM卡 xff0c 接线如下 通电后模块右下角会亮起红灯 xff0c 并且右上角四颗l
  • 用51单片机IIC协议OLED显示汉字

    接线如下 xff1a IIC协议 xff1a xff08 IIC全称Inter Integrated Circuit 集成电路总线 xff09 由PHILIPS公司在80年代开发的两线式串行总线 xff0c 用于连接微控制器及其外围设备 I
  • Linux中的open()、write()与read()函数,超详细

    open xff08 xff09 函数 xff1a int open const char pathname int flags mode t mode 使用open函数需要的头文件 xff1a include lt sys types h
  • C语言结构体对齐,超详细,超易懂

    结构体对齐规则 结构体的第一个成员总是存放在结构体变量开辟的空间的起始地址其它成员变量要存储在一个名叫对齐数的整数倍的地址结构体总大小为最大对齐数的整数倍 xff0c 结构体内每一个变量都会产生一个对齐数 xff0c 取其最大的对齐数如果是
  • 51单片机之串口通信、WiFi模块、蓝牙模块、4G模块

    目录 串口通信 全双工通信 xff08 打电话 xff09 TTL电平 UART 字节帧 串口相关的寄存器 串口的工作模式 蓝牙模块HC 08 HC 08的AT指令 编辑 WiFi模块ESP8266 配置WiFi模块作为客户端连入当前局域网
  • STM32单片机之温湿度检测系统(DTH11、OLED、LCD1602)

    LCD1602 LCD1602引脚 第 1 脚 VSS 为电源地 第 2 脚 VDD 接 5V 正电源 第 3 脚 VL 为液晶显示器对比度调整端 接正电源时对比度最弱 xff0c 接地时对比度最高 xff0c 对比度过高时会产生 鬼影 x
  • C_records

    1 include inlcude lt file h gt include file h lt gt 从编译器指定目录查找 从当前目录查找 xff0c 未发现再从指定目录查找 2 enum enum TYPE A B C 注意内部 xff
  • STM32之智能小车,手把手从0到1,模块化编程

    小车介绍 本博文将会从0到1实现一个智能小车 xff0c 该小车实现功能 xff1a 1 摇头避障模式 2 跟随模式 3 循迹模式 4 小车测速并显示在OLED屏幕 5 语音控制小车等等 硬件组成 STM32F103开发板 小车套件 L91
  • STM32之增量式编码器电机测速

    STM32之增量式编码器电机测速 编码器编码器种类按监测原理分类光电编码器霍尔编码器 按输出信号分类增量式编码器绝对式编码器 编码器参数分辨率精度最大响应频率信号输出形式 编码器倍频 STM32的编码器模式编码器模式编码器的计数方向仅在TI
  • STM32之MPU6050获取欧拉角

    STM32之MPU6050获取欧拉角 MPU6050MPU6050特点MPU6050电路图以及框图MPU6050框图MPU6050电路图 MPU6050相关寄存器电源管理寄存器1 xff08 0x6B xff09 陀螺仪配置寄存器 xff0
  • Postman(接口测试工具)

    目录 一 基本介绍 1 Postman 是什么 2 Postman 快速入门 2 1快速入门需求说明 二 Postman 完成 Controller 层测试 需要的代码 xff1a Java类 request jsp success jsp
  • QT网络编程TCP/UDP开发流程 制作网络调试助手

    目录标题 一 开发基础知识1 QT的网络编程 TCP和UDP2 网络编程接口1 listen2 connect 二 TCP编程1 TCP服务端实现流程2 TCP客户端实现流程 三 UDP编程四 源码1 TCP服务端2 TCP客户端3 UDP