在
前言
之前共享了两个关于Protobuf的注释:
Protobuf :更小、更快、更高效的协议
共享protobuf-c在嵌入式Linux平台上的使用案例
让我们来看看Protobuf在STM32平台上的使用。
与
nanopb简介
之前的文章中介绍的Protobuf-c相似,但nanopb也是轻量级且支持c语言的Protobuf。
nanopb的下载地址:
359 JPA.Kapsi.Fi /北约PB /下载/
在此使用nanopb-0.3.8-windows-x86。 目录:
nanopb在STM32上的使用
首先,准备可以串行打印的STM32项目。 示例:
在项目目录下创建新的Protobuf文件夹,在nanopb-0.3.8-windows-x86目录下创建以下7个文件
英格兰乙组联赛
公众号
PB _通用
PB _解码
PB _解码
Pb编码格式
PB _编码
复制到Protobuf文件夹:
在第一篇关于protobuf的文章中,protobuf的中心是. proto文件,您可以定制. proto以创建协议数据,然后使用protoc工具编译并生成c代码。 有两个文件:头文件和源文件。
其中,protoc工具位于我们下载的nanopb-0.3.8-windows-x86的生成器- BBD LT文件夹中。
必须将包含protoc.exe的路径添加到环境变量中,才能在命令行的任何路径中使用protoc工具。 这条路径如下。
c : \纳米PB-0.3.8-windows-x86 \生成器- BBD lt
将此路径添加到环境变量:
2d42f4f9098a91e4a411a0c20?from=pc”>
下面,我们在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飞艇稳赚不赔的打法1f80?from=pc”>
把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,即可免费获取!