2016年3月

在 arduino 与外界通讯参数多了解析起来就很麻烦。平时工作中网络通讯都用的 protobuf 来实现。就想能不能在 arduino 中也使用 protobuf,使用官方的C++库是不可能的了,编译出来的体积足以撑爆芯片的所有可用的空间。好在发现了一个第三方的 protobuf 实现库 nanopb,它可以以极低的资源占用来解析 protobuf,使用起来也不算麻烦。

编写 proto 协议描述文件

my.proto
message test {
    optional string name = 1;
    optional int32 id = 2;
}

编译 proto 文件

protoc -omy.pb my.proto

生成 nanopb 专用的输出格式

nanopb_generator my.pb

生成出 my.pb.h my.pb.c

与 arduino 代码对接

在 nanopb 里有这么些代码文件

这是 nanopb 的基础文件

  • pb.h
  • pb_common.h
  • pb_common.c

编码 protobuf 要用到的

  • pb_encode.h
  • pb_encode.c

解码 protobuf 要用到的

  • pb_decode.h
  • pb_decode.c

基础文件一定是要加的,编码解码的代码文件根据需要加入,生成的 my.pb.h my.pb.c 也需要加入进来。

临时变量不能作为非const引用参数,不是因为他是常量,而是因为c++编译器的一个关于语义的限制。如果一个参数是以非const引用传入,c++编译器就有理由认为程序员会在函数中修改这个值,并且这个被修改的引用在函数返回后要发挥作用。但如果你把一个临时变量当作非const引用参数传进来,由于临时变量的特殊性,程序员并不能操作临时变量,而且临时变量随时可能被释放掉,所以,一般说来,修改一个临时变量是毫无意义的,据此,c++编译器加入了临时变量不能作为非const引用的这个语义限制,意在限制这个非常规用法的潜在错误。

int64_t在32位系统中是long long int,在64位系统中是long int,所以打印int64_t的格式化方法是:

printf("%ld", value); // 64bit OS 
printf("%lld", value); // 32bit OS

兼容的方法:

#include <inttypes.h>  
printf("%" PRId64 "n", value);