加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
    • 说在前面的话
    • nanopb 简介
    • nanopb 在 STM32 上的使用
    • 最后
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

干货 | 项目乏力?nanopb助你一臂之力

2021/01/08
2333
阅读需 8 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

说在前面的话

这是一篇 2020 年欠下的文章,一直搁置着,现在还上。

之前分享了两篇关于 Protobuf 的笔记:Protobuf:一种更小、更快、更高效的协议、Protobuf 在嵌入式 Linux 平台使用。还差一篇 STM32 上的使用,这篇我们来看一起一下 Protobuf 在 STM32 平台使用,这样一来关于 Protobuf 的初步使用笔记就完整了。

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-x86\generator-bin

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

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

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

syntax = "proto2";

message Student
{
 required uint32 num      = 1;
 required uint32 py_score = 2;
 required uint32 c_score  = 3;
}

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

protoc --nanopb_out=. student.proto

生成 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 = %d\n", unpack_stu.num);
  printf("unpack_stu.py_score = %d\n", unpack_stu.py_score);
  printf("unpack_stu.c_score = %d\n", unpack_stu.c_score);
}

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

编译、下载验证:

以上就是本次关于 nanopb 在 STM32 上的使用的笔记介绍,如有错误欢迎指出,谢谢!这三篇笔记分享的关于 protobuf 的上手使用步骤都写得比较清楚了,感兴趣的小伙伴可自行动手实践;以后有用到更多的 protobuf 实操的地方我们再做学习、分享。

若对 nanopb 及本篇笔记 demo 感兴趣,可在嵌入式大杂烩公众号后台回复关键字nanopb,进行获取。

最后

以上就是本次的分享,如果觉得文章不错,转发、在看,也是我们继续更新的动力。

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
S25FL512SAGMFIR10 1 Spansion Flash, 512MX1, PDSO16, 0.300 INCH, LEAD FREE, PLASTIC, MO-013EAA, SOIC-16
$11.03 查看
TLP291(GB-TP,SE 1 Toshiba America Electronic Components OPTOISOLATOR 3.75KV TRANS 4-SO

ECAD模型

下载ECAD模型
$0.1 查看
KSZ8721BL-TR 1 Microchip Technology Inc DATACOM, ETHERNET TRANSCEIVER, PQFP48
$4.17 查看

相关推荐

电子产业图谱

本公众号专注于嵌入式技术,包括但不限于C/C++、嵌入式、物联网、Linux等编程学习笔记,同时,公众号内包含大量的学习资源。欢迎关注,一同交流学习,共同进步!