历史上的今天
返回首页

历史上的今天

今天是:2025年08月12日(星期二)

正在发生

2021年08月12日 | STM32 | protobuf在STM32平台的移植使用

2021-08-12 来源:eefocus

nanopb简介

同之前文章介绍的Protobuf-c类似,nanopb是也是一个轻量的、支持C语言的Protobuf。


nanopb下载地址:

 

https://jpa.kapsi.fi/nanopb/download/

我这里使用nanopb-0.3.8-windows-x86,目录:

nanopb在STM32上的使用

首先,准备一个可进行串口打印的STM32工程,如:

 

在工程目录下新建一个Protobuf文件夹,并把nanopb-0.3.8-windows-x86目录下如下7个文件

pb.h

pb_common.c

pb_common.h

pb_decode.c

pb_decode.h

pb_encode.c

pb_encode.h

复制至Protobuf文件夹中:

 

文首提到的关于protobuf的文章都有介绍到:protobuf的核心是一个.proto文件,我们自定义一个.proto来创建我们的协议数据,然后使用protoc工具编译生成C代码,有两个文件:一个头文件、一个源文件。


其中protoc工具在我们上面下载的nanopb-0.3.8-windows-x86的generator-bin文件夹中:

 

为了能在命令行中任何路径下使用protoc工具,我们需要把protoc.exe所在路径添加到环境变量中,我这里的路径为:

C:nanopb-0.3.8-windows-x86generator-bin

把这个路径添加到环境变量中:

 

 

 

 

 

 

下面,我们在Protobuf文件夹中创建一个student.proto文件

 

这个文件的内容我们编写为:

syntax = "proto2";message Student{
 required uint32 num      = 1;
 required uint32 py_score = 2;
 required uint32 c_score  = 3;}1.2.3.4.5.6.7.8.

 

然后win+r组合键进入运行窗口,输入cmd进入命令行;在命令行cd进入student.proto所在目录;输入如下命令编译student.proto:

protoc --nanopb_out=. student.proto

[object Object]

 

生成student.pb.c与student.pb.h文件:

 

把Protobuf文件夹里的文件添加到mdk工程并增加头文件搜索路径:

 

 

编译,无误:

 

编写测试代码:

void protobuf_test(void)

{

  uint8_t buffer[64] = {0};

  Student pack_stu = {0};

  pb_ostream_t o_stream = {0};

  Student unpack_stu = {0};

  pb_istream_t i_stream = {0};


  // 组包

  pack_stu.num  = 88;

  pack_stu.py_score = 90;

  pack_stu.c_score = 99;

  o_stream = pb_ostream_from_buffer(buffer, sizeof(buffer));

  pb_encode(&o_stream, Student_fields, &pack_stu);


  // 解包

  i_stream = pb_istream_from_buffer(buffer, sizeof(buffer));

  pb_decode(&i_stream, Student_fields, &unpack_stu);

  printf("unpack_stu.num = %dn", unpack_stu.num);

  printf("unpack_stu.py_score = %dn", unpack_stu.py_score);

  printf("unpack_stu.c_score = %dn", unpack_stu.c_score);

}


demo很简单,组包就是构造一个协议数据结构体,调用pack组包接口往buffer中扔数据;解包正好是反过来,从buffer中拿数据放到结构体里。其中,组包相关的函数在pb_encode.c中,解包相关的函数在pb_decode.c中,感兴趣的小伙伴可自行阅读。

编译、下载验证:

 

以上就是本次关于nanopb在STM32上的使用的笔记介绍,如有错误欢迎指出

推荐阅读

史海拾趣

Cystech公司的发展小趣事

为了进一步拓展全球市场,C-TECH Co., Ltd在2009年相继成立了香港分公司和中国(深圳)分公司。通过这两家分公司,公司能够更好地了解当地市场需求,提供更加贴近客户的服务。同时,公司还积极参加国际电子展会,与国际同行交流合作,不断提升自身的品牌影响力和市场竞争力。在国际化战略的推动下,C-TECH Co., Ltd的海外市场不断拓展,为公司的发展注入了新的动力。

Freqtech Ohg公司的发展小趣事

Freqtech Ohg公司深知人才是企业发展的第一资源。因此,公司高度重视人才培养和团队建设工作。公司建立了完善的人才培养体系,通过内部培训、外部引进等多种方式,不断提升员工的专业技能和综合素质。同时,Freqtech还注重营造积极向上的企业文化氛围,激发员工的创新精神和团队合作精神。这些努力使得Freqtech拥有一支高素质、专业化的研发团队和管理团队,为公司的持续健康发展提供了有力的人才保障。

需要注意的是,以上故事均为虚构内容,旨在反映电子行业公司可能经历的发展路径和面临的挑战与机遇。对于Freqtech Ohg公司的具体情况,建议直接查阅其官方网站或相关权威报道以获取准确信息。

Ferroperm公司的发展小趣事

随着产品的多样化发展,Ferroperm公司开始积极拓展市场,寻求更广阔的发展空间。他们不仅加强了与国内外客户的联系和合作,还积极参与国际展览和交流活动,提高了公司的知名度和影响力。同时,Ferroperm还与国际知名企业和研究机构建立了合作关系,共同开展技术研发和市场推广,进一步提升了公司的竞争力。

昆泰芯微电子(CONNTEK)公司的发展小趣事

昆泰芯微电子自成立以来,便以其深厚的技术实力和持续的创新能力,在电子行业中独树一帜。公司拥有一支由清华大学、荷兰代尔夫特理工大学等海内外知名大学毕业的专业技术团队,他们具备在恩智浦、美满电子及高通等半导体名企的工作经历,为公司带来了丰富的行业经验和前沿技术。在传感器芯片领域,昆泰芯微电子成功研发出具有国际一流性能的产品,成功打入一线知名品牌厂商,引领了行业风潮。

AMI Semiconductor公司的发展小趣事

为了加快产品国产化进程,昆泰芯微电子与世强先进(深圳)科技股份有限公司签订了授权代理合作协议。通过这一战略合作,昆泰芯微电子成功将旗下高端传感器产品触达至终端市场,实现了市场的快速扩张。同时,这一合作也进一步提升了昆泰芯微电子在行业中的知名度和影响力。

Electrocube Inc公司的发展小趣事

Electrocube Inc公司的创始人在创立之初便面临着重重挑战。当时,电子行业正处于快速发展阶段,市场竞争激烈。然而,创始人凭借对电子技术的深刻理解和敏锐的市场洞察力,成功开发出了一款高性能、低成本的电容器产品。这款产品迅速获得了市场的认可,为公司赢得了第一桶金,也为后续的发展奠定了坚实的基础。

问答坊 | AI 解惑

出现: hr -2147221164 {没有注册类别 } HRESULT

        if (dlgPush.DoModal())         {                 //得到pCERDA接口                 HRESULT hr = CoCr ...…

查看全部问答>

求助 关于MRC p15,0,R0,c0,c0,0的问题

MRC p15,0,R1,c0,c0,0这个指令是来读取ARM CPU的ID号到ARM寄存器R1里面的吗?如果是的话,我现在在EVC环境下嵌入了有下面汇编内容的.s文件:         AREA        |.text|, CODE &n ...…

查看全部问答>

高分求字库文件

我现在开发一款产品,液晶显示需要16X16中文点阵字库,考虑地区的不同,需要中文简体字库,香港的特有字库。网上找了好久也没找到合适的。各位大哥谁有发我个或提供个路径下载。…

查看全部问答>

菜鸟求助:一份正常的BSP我的电脑编译出来的系统无法正常运行?

OMAP3530 + WinCE6 R3 由于项目开始时是基于一个较早版本的BSP,现在打算更新到TI的最新BSP. 更新才刚刚开始一点,就被卡住了.先把屏的参数拷过来,屏可以正常显示,发现触摸屏没用,然后就拷过来触摸屏的一些参数,发现还是没用. 然后就开始分析了: ...…

查看全部问答>

紧急!!!!!!!!!!

有谁了解深圳\"研祥智能科技\"公司吗?那边的待遇怎么样,我是08年的应届毕业生,现在已经应聘上了那家公司,还没签协议.我很想知道,本科生在那边的待遇和发展怎么样呢? 望各位知情的大虾帮帮忙啊 ~不盛感激~…

查看全部问答>

兄弟们用过ObReferenceObjectByName吗?

在ntddk.h里怎么找不到这个函数啊,但我看好多程序都调用这个函数了…

查看全部问答>

中断标志位放在中断程序中判断有什么用?

interrupt[PORT_vector]void PORT1(void) { if(P1IFG&BIT0) {Delay(); if(P1IFG&BIT0) {执行体; P1IFG&=~BIT0; } } } 这样能去抖动吗 ,我感觉在中断程序中判断中断 ...…

查看全部问答>

数据经常要读取,不太会变,该用什么呢

EEPROM吗,读取时间长不长,还是说用其他的…

查看全部问答>

如何进行电流检测?

本帖最后由 dontium 于 2015-1-23 12:40 编辑 请问各位大牛,如果要对4~20ma的电流进行检测怎么设计比较合适?我选的一款ad芯片内阻是兆欧级别的,所以一开始设计让要检测的电流通过一个小电阻接地后,在小电阻上取电压进行检测。后来找资料的时候 ...…

查看全部问答>