从入门到实战:全面解析Protobuf的安装配置、语法规范与高级应用——手把手教你用Protobuf实现高效数据序列化与跨语言通信

作者:羑悻的小杀马特.日期:2025/10/9

文章目录

  • 本篇摘要
  • 一.`Protocol Buffers(Protobuf)`简介
        • 1. **核心定义**
          * 2. **核心作用**
          * 3. **对比优势**
          * 4. **使用关键点**
          * 总结
  • 二.`基于windows及ubuntu22.04安装Protobuf`
    • `windows`
    • ubuntu22.04
  • 三.快速上手protobuf编写及测试
    • 规范说明
    • 编译命令
    • 编译生成结果
  • 四.proto3语法解析之字段规则与消息定义
  • 五. `Protobuf 命令行decode操作`
  • 六.仓库链接
  • 七.本篇小结

在这里插入图片描述

本篇摘要

本文详解Protobuf核心:从简介、Windows/Ubuntu安装、基础语法(字段规则/消息定义)到实战(通讯录增删改查),涵盖编译命令、序列化/反序列化函数、多方式定义数组及命令行解码,助快速掌握高效数据序列化方案。

一.Protocol Buffers(Protobuf)简介

1. 核心定义

Protobuf 是 Google 开发的一种结构化数据序列化方案,用于将对象(结构化数据)高效转换为字节序列(序列化),并支持从字节序列还原对象(反序列化)。

2. 核心作用

解决痛点

传统序列化方式(如 XML/JSON)存在数据冗余大、解析慢、扩展性差等问题。

主要场景

  • 数据存储:将结构化数据以紧凑格式持久化到磁盘或数据库。
  • 网络传输:在分布式系统、微服务、RPC 通信中高效传输数据(如 gRPC 的默认序列化协议)。
3. 对比优势
特性Protobuf(PB)传统方式(XML/JSON)
数据体积更小(二进制编码,无冗余文本)较大(文本格式,含标签和空格)
处理速度更快(二进制解析效率高)较慢(需解析文本标签)
跨语言/平台支持(通过编译生成多语言代码)支持(但依赖文本解析库)
扩展性强(字段可增减且兼容旧版本)弱(字段变更易破坏兼容性)
可读性差(二进制,不可直接阅读)好(文本格式,可直接查看)
4. 使用关键点

在这里插入图片描述

  • 依赖编译生成代码:需先通过 .proto 文件定义数据结构,再用 Protobuf 编译器(protoc)生成目标语言(如 C++/Java/Python)的头文件和源文件,最终在代码中调用生成的类实现序列化/反序列化。
  • 典型应用:Google 内部大量服务通信、gRPC 框架的数据传输、游戏/物联网等对性能要求高的场景。
总结

Protobuf 是一种高效、紧凑、跨平台的结构化数据序列化工具,适合对性能、体积和兼容性要求较高的场景,是替代 XML/JSON 的主流方案之一。

二.基于windows及ubuntu22.04安装Protobuf

windows

点击对应连接进行下载:

https://github.com/protocolbuffers/protobuf/releases

在这里插入图片描述

在这里插入图片描述

  • 这里下载对应的v21.11版本的。

在这里插入图片描述

  • 下载完进行解压得到对应文件。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 把对应的bin程序的路径添加进入环境变量。

在这里插入图片描述

  • 表明安装成功。

ubuntu22.04

首先安装对应依赖库:

sudo apt-get install autoconf automake libtool curl make g++ unzip -y

去对应官网下载v21.11版本的压缩包:

https://github.com/protocolbuffers/protobuf/releases

在这里插入图片描述

  • 选择对应版本进行下载。

在这里插入图片描述
在这里插入图片描述

  • 下载完后进行解压;因为下载的是多语言版本的故需要执行这个命令。

修改安装⽬录,统⼀安装在/usr/local/protobuf下: ./configure --prefix=/usr/local/protobuf

下面进行make 以及make install安装:

在这里插入图片描述

  • 安装到了指定目录。

因此默认路径变成指定的了故配置文件也需要更改:

使用:sudo vim /etc/profile;然后把下面代码贴进去:

1# 添加内容如下:
2#(动态库搜索路径) 程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径
3export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/protobuf/lib/
4#(静态库搜索路径) 程序编译期间查找动态链接库时指定查找共享库的路径
5export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/protobuf/lib/
6#执行程序搜索路径
7export PATH=$PATH:/usr/local/protobuf/bin/
8#c程序头文件搜索路径
9export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/protobuf/include/
10#c++程序头文件搜索路径
11export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/protobuf/include/
12#pkg-config 路径
13export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig/
14

如下:

在这里插入图片描述

最后用 protoc --version 查看下版本即可。

在这里插入图片描述

  • 成功安装上。

三.快速上手protobuf编写及测试

规范说明

  1. .proto文件规范
  • 文件命名:全小写字母,用下划线连接(如 lower_snake_case.proto)。
  • 代码缩进:统一使用2个空格。
  1. proto3语法基础
  • proto3是最新语法版本,简化语言且支持多语言(如Java/C++/Python)。
  • 必须在.proto文件第一行(除注释外)指定 syntax = "proto3";,否则默认使用proto2。
  1. package声明符
  • 可选,用于定义命名空间,确保消息名称唯一性,避免冲突(如 package contacts;)。
  1. 消息(message)定义
  • 用于定义结构化对象(如联系人),支持定制协议字段,生成类和方法供网络传输或数据存储使用。
  1. 消息字段定义
  • 格式:字段类型 字段名 = 字段唯一编号;
  • 字段名:全小写字母+下划线(如 contact_name)。
  • 字段类型:标量类型(如int32)或特殊类型(如枚举、其他消息)。
  • 编号:唯一且不可更改,用于标识字段。
  1. 字段编号范围限制
  • 有效范围:1536,870,911(2²⁹-1),其中19000~19999为协议预留号,不可使用(使用会报错)。
  1. 字段编号编码规则
  • 编号1~15:用1个字节编码(含编号和类型),适合高频字段。
  • 编号16~2047:用2个字节编码,适合低频字段。
  • 建议高频字段优先使用1~15编号以节省空间。

注:其余类型如下:

以下表格展示了定义于消息体中的标量数据类型,以及编译 .proto 文件之后自动生成的类中与之对应的字段类型。在这里展示了与 C++ 语言对应的类型。

.proto TypeNotesC++ Type
doubledouble
floatfloat
int32使用变长编码[1]。负数的编码效率较低 —— 若字段可能为负值,应使用 sint32 代替。int32
int64使用变长编码[1]。负数的编码效率较低 —— 若字段可能为负值,应使用 sint64 代替。int64
uint32使用变长编码[1]。uint32
uint64使用变长编码[1]。uint64
sint32使用变长编码[1]。符号整型。负值的编码效率高于常规的 int32 类型。int32
sint64使用变长编码[1]。符号整型。负值的编码效率高于常规的 int64 类型。int64
fixed32定长 4 字节。若值常大于 2^28 则会比 uint32 更高效。uint32
fixed64定长 8 字节。若值常大于 2^56 则会比 uint64 更高效。uint64
sfixed32定长 4 字节。int32
sfixed64定长 8 字节。int64
boolbool
string包含 UTF-8 和 ASCII 编码的字符串,长度不能超过 2^32 。string
bytes可包含任意的字节序列但长度不能超过 2^32 。string

[1] 变长编码是指:经过protobuf 编码后,原本4字节或8字节的数可能会被变为其他字节数。

编译命令

  1. protoc 是 Protocol Buffer 编译工具。
  2. --proto_path(可简写为 -I):指定 .proto 文件所在目录,不指定则搜当前目录;若文件 import 其他文件或文件不在当前目录,需用它指定。
  3. --cpp_out:指定编译输出为 C++ 文件,后面跟目标路径。
  4. path/to/file.proto:要编译的 .proto 文件。

演示如下:

对应proto文件:

1//第一行必须是语法
2syntax="proto3"; //默认是2;很多语言等不支持
3
4package Person;
5
6message Person{
7  int32 age=1;
8  string name=2;
9
10}
11

编译有两种方式:

在这里插入图片描述
注:这里由于多个proto文件如果在不同目录;其实-I后面路径可以有多个。

编译生成结果

编译 contacts.proto 文件(以 C++ 为例)会生成 contacts.pb.hcontacts.pb.cc 两个文件。其中,每个 message 对应一个消息类,类中包含字段的读写及操作方法;.h 存类声明,.cc 存类实现 。

下面看下.h文件:

在这里插入图片描述

  • 可以看到继承父类添加了对应的建立清空返回对应字段的函数。
  • 然后就是对应的序列化与反序列化的一些函数就在对应的父类message里面;包含了它的头文件。
  • 然后.cc就是对应方法的实现。

常用对应序列化与反序列化函数:

1class MessageLite {
2public:
3    //序列优:
4    bool SerializeToStreamorem(ostream* output);
5    //将序列化后数据写入文件 流
6    bool SerializeToArray(void* data, int size) const;
7    bool SerializeToString(string* output) const;
8    //反序列优:
9    bool parseFromistreamistream(istream* input);
10    // 从流中读取数据,再进行反序列化 动作
11    bool ParseFromArray(const void* data, int size);
12    bool parseFromString(const string& data);
13};
14

注意事项:

  1. 序列化结果是二进制字节序列(因此有的不可见),非文本格式
  2. 三种序列化方法无本质区别,仅输出格式不同,适用场景有别
    3. 序列化API函数为const成员函数,因序列化不改变类对象内容,只将结果保存至指定地址。
  3. 详细message API见完整列表:官网链接

下面演示下:

在这里插入图片描述

  • 这里为了方便可以先安装下对应的插件。

测试程序:

1#include<person.pb.h>
2#include<string>
3#include<iostream>
4
5int main(){
6  
7    Person::Person p1;
8    p1.set_age(1);
9    p1.set_name("张三");
10
11     std::string s;
12  bool ok=  p1.SerializeToString(&s);
13
14if(!ok) std::cout<<"序列化错误"<<std::endl;
15
16  std::cout<<"序列化结果: "<<s<<std::endl;
17    Person::Person p2;
18
19    p2.ParseFromString(s);
20
21    std::cout<<"name: "<<p2.name()<<std::endl;
22    std::cout<<"age: "<<p2.age()<<std::endl;
23    return 0;
24}
25
26

对应结果:

在这里插入图片描述

  • 可以看到序列化的结果存在不可见性。

小结下:

ProtoBuf 通过编写 .proto 文件定义结构对象及属性,用 protoc 编译器生成接口代码,开发时依赖这些代码实现对定义字段的操作及对象的序列化反序列化,无需手动编写协议解析代码。

四.proto3语法解析之字段规则与消息定义

基于protobuf实现的通讯录格式来讲解(protobuf的文件储存方面的应用)。

下面比如通讯录的人有多个号码;这是可以类似数组形式去定义:

这里支持四种方式来定义这个数组:

1.文件内定义电话类:

1  message Phone{
2    string number=1;
3  }
4
5

然后可以直接在对应PersonInfo类使用即可。

2.定义嵌套类:

1message PersonInfo{
2  message Phone{
3    string number=1;
4  }
5repeated  Phone phone=4; //最简单的以数组形式
6}
7

3.直接内部定义string数组:

1repeated string phone_number=3 //最简单的以数组形式
2

4.定义在此文件外部的文件然后导入:

在使用的文件中先要导入对应文件:import "phone.proto" 支持文件导入;然后在使用即可:

1repeated phone.phone phone=4   //如果是文件导入的时候要加上对应的命名空间.对应类名。
2

下面实现了一个只有对应的名字/年龄以及支持一个人有很多号码的基于文件的读写通讯录:

基于上面说的类套类实现的proto文件:

1//第一行必须是语法
2syntax="proto3"; //默认是2;很多语言等不支持
3
4package contacts;
5//import "phone.proto" 支持文件导入
6message PersonInfo{
7  int32 age=1;
8  string name=2;
9
10  //repeated string phone_number=3 //最简单的以数组形式
11  //定义内部嵌套类(也可以文件导入或者搞在此文件外部)
12  message Phone{
13
14    string number=1;
15
16  }
17repeated  Phone phone=4; //最简单的以数组形式
18
19  //repeated phone.phone phone=4   //如果是文件导入的时候要加上对应的命名空间.对应类名。
20
21}
22
23// 通讯录 message(一群联系人)
24message Contacts {
25  repeated PersonInfo contacts = 1;
26}
27

下面进行编译:

对应的.pb.h文件:

在这里插入图片描述

  • 这里可看到proto文件里面定义的两个类被继承父类后再次实现(这里如果是写入嵌套类就会变成PersonInfo_Phone 这样新的组成解析成C++的类)。

下面就是写与读的文件:

1.write.cc:

思路:

  • 首先读取对应文件内容从流中反序列化到对应的整体protobuf对象中(如果文件不存在就直接创建);然后在对应protobuf对应继续追加(写入对应对象);然后再从对象写入文件输出流中;就到了对于文件。

对应源码:

1#include <iostream>
2#include <fstream>
3#include "contacts.pb.h" //默认先从当前目录;然后没有再去系统对应目录
4#include <string>
5
6using namespace std;
7
8void add_contacters(contacts::PersonInfo *persons)
9{
10
11    cout << "-------------新增联系⼈-------------" << endl;
12    cout << "请输入联系人姓名:";
13    string name;
14    getline(cin, name); // 遇到缓冲区的\n默认停止并删除它
15    persons->set_name(name);
16    cout << "请输入联系人年龄:";
17    int age;
18    cin >> age; // 缓冲区留着\n需要手动清除
19    persons->set_age(age);
20    cin.ignore(256, '\n'); // 最大值值读取256个读到就删除完终止;没有读完256个直接终止
21
22    // 输入所有的电话号码:
23
24    for (int i = 0;; i++)
25    {
26
27        cout << "请输入联系人电话" << i + 1 << "(只输⼊回⻋完成电话新增):";
28
29        string number;
30
31        getline(cin, number);
32
33        // 进行是否停止的判断:
34
35        if (number.empty())
36        {
37            break;
38        }
39
40        contacts::PersonInfo_Phone *phone = persons->add_phone();
41        phone->set_number(number);
42    }
43}
44
45int main()
46{
47
48    contacts::Contacts contacts;
49
50    // 读取对应二进制protobuf格式存储的文件+输入文件
51
52    // 读取对应文件:
53    std::fstream input("contacts.bin", std::ios::in | std::ios::binary); // 不存在文件自动创建
54
55    if (!input)
56    { // 不存在自动创建后对应文件指针就是nullptr
57
58        std::cout << "contacts.bin not find, create new file!" << std::endl;
59    }
60
61    // 如果对应文件存在也就是里面有内容(此时就需要加入对应对象中然后再进行添加;最后一再次从头写入:
62
63    else if (!contacts.ParseFromIstream(&input))
64    {
65        cerr << "parse error!" << endl;
66        input.close();
67        return -1;
68    }
69
70    // 进行添加对应联系人:
71
72    // 1.完成对应的PersonInfo数组填充:
73    add_contacters(contacts.add_contacts()); // 对于类套类时候;必须这样添加对应没有对应set_object等操作(从对应对象成员后面的位置开始添加;也就是返回下一个的地址)
74
75    // 2.写入文件:
76
77    std::fstream output("contacts.bin", std::ios::out | std::ios::binary);
78
79    if (!contacts.SerializeToOstream(&output))
80    {
81        cerr << "write error!" << endl;
82        input.close();
83        output.close();
84        return -1;
85    }
86
87    cout << "write success!" << endl;
88    input.close();
89    output.close();
90    return 0;
91}
92

2.read.cc:

思路:

  • 从对应的文件流反序列化到protobuf对象中;然后完成遍历打印即可

对应源码:

1#include <iostream>
2#include <fstream>
3#include "contacts.pb.h" //默认先从当前目录;然后没有再去系统对应目录
4#include <string>
5
6using namespace std;
7
8void printcontacts(contacts::Contacts cs)
9{
10
11    for (int i = 0; i < cs.contacts_size(); i++)
12    {
13
14        cout << "\n---------------联系人" << i + 1 << "---------------" << endl;
15        // 取出对应联系人“:
16
17        contacts::PersonInfo personinfo = cs.contacts(i);
18
19        cout << "联系人姓名:" << personinfo.name() << endl;
20        cout << "联系人年龄:" << personinfo.age() << endl;
21
22        for (int j = 0; j < personinfo.phone_size(); j++)
23        {
24            contacts::PersonInfo_Phone phone = personinfo.phone(j);
25            cout << "联系人电话" << j + 1 << ":" << phone.number()<< endl;
26        }
27    }
28}
29int main()
30{
31
32    contacts::Contacts contacts;
33
34    // 完成读取出来到protobuf对象;然后在打印:
35    fstream input("contacts.bin", ios::in | ios::binary);
36    if (!contacts.ParseFromIstream(&input))
37    {
38        cerr << "parse error!" << endl;
39        input.close();
40        return -1;
41    }
42
43    printcontacts(contacts);
44    return 0;
45}
46

makefile:

1
2all: write read
3write:write.cc contacts.pb.cc
4	g++ -o $@ $^ -std=c++11 -lprotobuf
5read:read.cc contacts.pb.cc
6	g++ -o $@ $^ -std=c++11 -lprotobuf
7.PHONY:clean
8clean:
9	rm -f write read
10

下面测试下:

在这里插入图片描述

  • 第一次启动write;因为原来的文件没内容;故新创建然后再输入。

在这里插入图片描述

  • 下面再次添加(就是追加了)。

在这里插入图片描述

  • 这里发现对应的二进制文件是非文本形式存储。

在这里插入图片描述

  • 使用对应查看二进制命令查看(可以把对应二进制转化成16进制以及ASCII码

在这里插入图片描述

  • 进行二进制文件里的内容。

五. Protobuf 命令行decode操作

命令

1protoc --decode=<命名空间+消息类型> <proto文件> < 二进制数据文件
2

作用

将二进制数据(如网络传输或文件存储的 protobuf 编码内容)解码为可读文本,按 .proto 文件定义显示字段名和值。

关键点

  1. 必填参数
  • <命名空间+消息类型>:.proto 文件中定义的消息名称(如 Person)。
  • <proto文件>:包含该消息定义的 .proto 文件路径。
  1. 输入源
  1. 输出
  • 文本形式展示解码后的字段(如 name: "Alice"),若字段缺失则不显示(值为默认值)。

注意:二进制数据必须与 .proto 定义的消息类型和字段规则严格匹配,否则解码可能失败

下面拿上面演示过的二进制文件演示下:

在这里插入图片描述

  • 可以看到这里除了名字是以八进制打印出来;其他都是以易懂形式展现;方便调试。

查看其他protoc搭配的命令可以查看对应手册:

在这里插入图片描述

六.仓库链接

Protobuf仓库传送门

七.本篇小结

Protobuf通过.proto文件定义结构,用protoc生成多语言代码,实现高效二进制序列化。支持数组多种定义、严格字段编号规则,搭配命令行解码调试,是替代JSON/XML的高性能跨平台方案,适用于网络传输与数据存储。


从入门到实战:全面解析Protobuf的安装配置、语法规范与高级应用——手把手教你用Protobuf实现高效数据序列化与跨语言通信》 是转载文章,点击查看原文


相关推荐


cygwin + redis
欧的曼2025/10/8

1. 下载 Redis 源码 推荐安装稳定版(如 Redis 7.0.12,可从 Redis 官网下载页 获取最新稳定版链接): wget https://download.redis.io/releases/redis-7.0.12.tar.gz 2. 解压并进入源码目录 3. 编译 Redis(关键步骤) 找到Cygwin安装目录下的usr\include\dlfcn.h文件,修改如下代码,将#if __GNU_VISIBLE、#endif 这两行注释掉。(使用// 或 /


【OpenCV】图像处理入门:从基础到实战技巧
朋鱼燕2025/10/6

目录 1.对图像的基本理解 2.数据读取-图像 ​编辑 3.数据读取-视频 4.ROI区域 1.对图像的基本理解 图像是由一个个像素点组成的,RGB图像有三个通道,而灰度图像只有一个通道 RGB每个通道的像素点的值的范围是0-255,数值越大,对应该颜色通道的亮度越亮 2.数据读取-图像 在文件的路径下读取一张图像,不能包含中文 opencv的读取格式是BGR cv2.waitKey(0)按下任意键才关闭图像,换成1000的话是显示1000


【Docker】说说卷挂载与绑定挂载
你的人类朋友2025/10/5

前言 我最开始接触 Docker 的时候,遇到 mysql 这样的容器,我一般使用卷挂载。它的好处就是将挂载的位置交给 Docker 管理,我们规定卷的名字即可,不需要关心挂载的位置。我感觉这样很方便,所以后面我基本一遇到挂载就用卷挂载。 但是最近,我慢慢地开始喜欢上绑定挂载了。特别是要部署一个什么环境之类的【如 n8n、redis】,都会优先使用绑定挂载。这个挂载方式会让我更有一种掌控感。 今天就来总结这两种挂载方式的相关知识。 正文 一、什么是 Docker 数据挂载? 在 Docker 中


基于LazyLLM多Agent大模型应用的开发框架,搭建本地大模型AI工具,你贴身的写作、论文小助手
xcLeigh2025/10/4

在搭建本地大模型作为写作、论文小助手时,开发者常面临诸多技术难题:模型部署需研究复杂 API 服务,微调模型要应对框架选择与模型切换的困扰,工具落地还需掌握 Web 开发技能,这让初级开发者望而却步,资深专家也需为适配需求、集成新工具耗费大量精力。而 LazyLLM 多 Agent 大模型应用开发框架可有效解决这些问题,它打包了应用搭建、数据准备、模型部署、微调、评测等全环节工具。初级开发者借助预置组件即可打造有生产价值的 AI 工具,资深专家能依托其模块化设计集成自有算法与前沿工具,助力不同水


自存19-48
北慕阳2025/10/2

19-菜单管理添加弹窗显示 <template> <button @click="dialogFormVisable = true ">打开</button> <el-dialog v-model="dialogFormVisable" :before-close="beforeClose" title="添加权限" width="500" > <el-form


🔥 连八股文都不懂还指望在前端混下去么
Gaby2025/10/2

废话只说一句:码字不易求个👍,收藏 === 学会,快行动起来吧!🙇‍🙇‍🙇‍。2024.03.04 由于篇幅限制更详细的内容已更新到 ☞ 我的 GitHub 上,有纠正错误和需要补充的小伙伴可以在这里留言,我会及时更新上去的。推荐个API管理神器 Apipost 用过的都知道好使 1. HTTP 和 HTTPS 1.http 和 https 的基本概念 http: 是一个客户端和服务器端请求和应答的标准(TCP),用于从 WWW 服务器传输超文本到本地浏览器的超文本传输协议。 http


学习日报 20250923|MQ (Kafka)面试深度复盘
靈臺清明2025/10/2

MQ 面试深度复盘:从实战经验到底层设计全解析 在分布式系统架构面试中,消息队列(MQ)是考察候选人技术深度与实战经验的核心模块之一。本文基于真实面试场景,从 MQ 的实际应用、核心价值、产品选型、故障排查到架构设计,进行全面复盘总结,既适合面试备考记忆,也可作为技术文章发布,帮助更多开发者梳理 MQ 知识体系。 一、基础认知:你真的懂 MQ 的 “用武之地” 吗? 面试中,面试官往往从 “是否用过 MQ” 切入,逐步深入到 “为什么用”,核心是考察候选人对 MQ 核心价值的理解是否停留在


桌面预测类开发,桌面%性别,姓名预测%系统开发,基于python,scikit-learn机器学习算法(sklearn)实现,分类算法,CSV无数据库
合作小小程序员小小店10/1/2025

这一个也是和信号识别的那个项目demo一样。桌面很常用的开发框架tkinter,在没有pyqt之前一直用着,帮客户修改一下代码。人工智能应用开发套路还是一样,从csv获取数据集,进行数据集清洗去重等操作,完成数据清洗就可以构造模型进行模型fit了,最后模型预测评估调优。


常见开发语言在 Windows 上的默认编码格式
十启树9/30/2025

字符串是字节流,输出编码取决于手动设置(如 header 或 mb_* 函数)


基于单片机的Boost升压斩波电源电路
清风6666662025/10/11

基于单片机的Boost升压斩波电源电路设计 点击链接下载资料:https://download.csdn.net/download/m0_51061483/92081480 1. 系统功能概述 本系统以单片机为核心控制单元,设计并实现了一种Boost升压型斩波电源电路。系统能够实现输入5V电压,通过Boost电路升压至可调的20V输出范围。用户可通过按键设置目标输出电压,液晶LCD模块实时显示当前输出电压与设定电压,形成完整的闭环控制系统。 系统采用PWM控制技术与DA(数模转换)调

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0