手把手教你在STM32上使用nanopb_stm32 njtrst

手把手教你在STM32上使用nanopb_stm32 njtrst

编码文章call10242025-09-11 15:46:223A+A-

前言

之前分享了两篇关于Protobuf的笔记:

Protobuf:一种更小、更快、更高效的协议

protobuf-c在嵌入式Linux平台的使用实例分享

这篇我们来看一起一下Protobuf在STM32平台使用。

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上的使用的笔记介绍,如有错误欢迎指出,谢谢!

如果文章对你有帮助,麻烦帮忙转发,谢谢大家!


1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。私信回复1024,即可免费获取!

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4