在VisualStudio下开发第一个PlatformIO项目并集成nanopb
命令行创建PlatformIO项目
创建新的目录,firstpio,进入这个目录,执行下面的命令创建一个新的platformio项目,同时创建visualstudio的工程文件,这里我用到了两块板。
platformio init --ide visualstudio --board uno --board d1_mini
创建成功,命令行可以看到下面的输出:
项目的目录结构如下:
include目录,放项目用到的头文件
lib目录,放项目的私有库
src目录,放项目的源代码文件
platformio.ini,项目配置文件,编译,链接,运行相关的参数都在这个文件中
项目配置文件
默认生成的配置文件,包含两个board,就是上面命令行传入的uno和d1_mini,在配置文件中分别对应env:d1_mini和env:uno两个节点。可以针对不同的board来设置不同的编译配置,依赖的库,运行的命令等。
我们为两个board设置不同的参数:
[common_env_data]
build_flags =
-D VERSION=1.2.3
-D DEBUG=1
lib_deps_builtin =
SPI
Wire
lib_deps_external =
ArduinoJson
上面是公共的编译选项,内置库依赖,外部库依赖的定义。修改d1_mini的配置:
[env:d1_mini]
platform = espressif8266
board = d1_mini
framework = arduino
build_flags =
${common_env_data.build_flags}
-DSSID_NAME=Hello
-SSID_PASSWORD=World
lib_deps =
${common_env_data.lib_deps_builtin}
${common_env_data.lib_deps_external}
PubSubClient
monitor_speed = 115200
upload_port = COM4
lib_deps配置项目依赖的库,上面的${common_env_data.lib_deps_builtin},就是用来引用上面定义的变量。monitor_speed,设置串口的波特率。upload_port设置上传的串口号。这里我设的是COM4,因为在Windows平台上,Linux上应该是/dev/ttyUSB*等等。
board uno的配置跟上面类似,不再赘述。
在Visual Studio中编译
在src目录下添加一个名为main.cpp的文件,打开platformio.vcproj项目文件,将main.cpp添加到项目中。写入测试代码:
#include
void setup() {
Serial.begin(115200);
Serial.println("Hello PlatformIO");
}
void loop() {
}
在VS中选择编译,可以看到,它同时编译了d1_mini和uno两个平台。
很方便。
命令行编译和上传
pio run -e d1_mini -t upload
上面的命令,编译d1_mini环境,编译完毕后直接上传。-e 指定编译环境。-t 指定编译后的操作,还可以是monitor,即打开串口监视,如下:
pio run -e d1_mini -t monitor
uno环境的编译同理,不再赘述。
测试集成nanopb
添加nanopb库
在项目的lib目录下新建一个目录nanopb,将下面的源文件拷到这里:
lib下面的库,platformio编译的时候会自动添加头文件和源文件进行编译,不用手动操作,很方便。
在项目根目录下面新建目录nanopb,将里面放入protobuf的proto文件,我写了个批处理,自动编译proto文件:
@echo off
protoc --nanopb_out=..\src simple.proto
生成的文件自动放到src目录,同样的不用手动操作,platformio会自动将这个目录下的源代码添加进编译过程。
调用nanopb
修改main.cpp:
#include
#include
#include
#include "simple.pb.h"
void setup() {
Serial.begin(115200);
Serial.println("Hello PlatformIO");
/* This is the buffer where we will store our message. */
uint8_t buffer[128];
size_t message_length;
bool status;
/* Encode our message */
{
/* Allocate space on the stack to store the message data.
*
* Nanopb generates simple struct definitions for all the messages.
* - check out the contents of simple.pb.h!
* It is a good idea to always initialize your structures
* so that you do not have garbage data from RAM in there.
*/
SimpleMessage message = SimpleMessage_init_zero;
/* Create a stream that will write to our buffer. */
pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
/* Fill in the lucky number */
message.lucky_number = 13;
/* Now we are ready to encode the message! */
status = pb_encode(&stream, SimpleMessage_fields, &message);
message_length = stream.bytes_written;
/* Then just check for any errors.. */
if (!status)
{
#ifdef D1_MINI
printf("Encoding failed: %s\n", PB_GET_ERROR(&stream));
#endif
}
}
/* Now we could transmit the message over network, store it in a file or
* wrap it to a pigeon's leg.
*/
/* But because we are lazy, we will just decode it immediately. */
{
/* Allocate space for the decoded message. */
SimpleMessage message = SimpleMessage_init_zero;
/* Create a stream that reads from the buffer. */
pb_istream_t stream = pb_istream_from_buffer(buffer, message_length);
/* Now we are ready to decode the message. */
status = pb_decode(&stream, SimpleMessage_fields, &message);
/* Check for errors... */
if (!status)
{
#ifdef D1_MINI
printf("Decoding failed: %s\n", PB_GET_ERROR(&stream));
#endif
}
/* Print the data contained in the message. */
#ifdef D1_MINI
printf("Your lucky number was %d!\n", (int)message.lucky_number);
#endif
}
}
void loop() {
}
编译上传
pio run -e d1_mini -t upload
打工告成!
本文由博客一文多发平台 OpenWrite 发布!