历史上的今天
今天是: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上的使用的笔记介绍,如有错误欢迎指出
史海拾趣
|
出现: hr -2147221164 {没有注册类别 } HRESULT if (dlgPush.DoModal()) { //得到pCERDA接口 HRESULT hr = CoCr ...… 查看全部问答> |
|
MRC p15,0,R1,c0,c0,0这个指令是来读取ARM CPU的ID号到ARM寄存器R1里面的吗?如果是的话,我现在在EVC环境下嵌入了有下面汇编内容的.s文件: AREA |.text|, CODE &n ...… 查看全部问答> |
|
菜鸟求助:一份正常的BSP我的电脑编译出来的系统无法正常运行? OMAP3530 + WinCE6 R3 由于项目开始时是基于一个较早版本的BSP,现在打算更新到TI的最新BSP. 更新才刚刚开始一点,就被卡住了.先把屏的参数拷过来,屏可以正常显示,发现触摸屏没用,然后就拷过来触摸屏的一些参数,发现还是没用. 然后就开始分析了: ...… 查看全部问答> |
|
有谁了解深圳\"研祥智能科技\"公司吗?那边的待遇怎么样,我是08年的应届毕业生,现在已经应聘上了那家公司,还没签协议.我很想知道,本科生在那边的待遇和发展怎么样呢? 望各位知情的大虾帮帮忙啊 ~不盛感激~… 查看全部问答> |
|
interrupt[PORT_vector]void PORT1(void) { if(P1IFG&BIT0) {Delay(); if(P1IFG&BIT0) {执行体; P1IFG&=~BIT0; } } } 这样能去抖动吗 ,我感觉在中断程序中判断中断 ...… 查看全部问答> |




