本指南将带你快速上手 RPL,完成第一个数据包的定义、序列化和解析。
1. 定义数据包
推荐使用 RPL 在线生成器 图形化生成代码。
如果你想手动编写,只需定义一个结构体并特化 PacketTraits:
#pragma once
#include <cstdint>
struct ControlPacket {
float x;
float y;
float w;
uint8_t mode;
};
namespace RPL::Meta {
template <>
struct PacketTraits<ControlPacket> {
static constexpr uint16_t id = 0x101;
static constexpr size_t size = sizeof(ControlPacket);
};
}
2. 编写主程序
创建一个 main.cpp:
#include <iostream>
#include <vector>
#include "MyPackets.hpp"
int main() {
ControlPacket tx_packet{1.0f, 2.0f, 3.14f, 1};
std::vector<uint8_t> buffer(128);
auto result = serializer.
serialize(buffer.data(), buffer.size(), tx_packet);
size_t frame_len = result.value();
std::cout << "Serialized " << frame_len << " bytes." << std::endl;
parser.push_data(buffer.data(), frame_len);
auto rx_packet = deserializer.
get<ControlPacket>();
std::cout << "Received: x=" << rx_packet.x
<< ", y=" << rx_packet.y
<< ", mode=" << (int)rx_packet.mode << std::endl;
return 0;
}
反序列化器类
定义 Deserializer.hpp:36
T get() noexcept
获取指定类型的数据包
定义 Deserializer.hpp:51
序列化器类
定义 Serializer.hpp:47
tl::expected< size_t, Error > serialize(uint8_t *buffer, const size_t size, const Packets &... packets)
将数据包序列化到用户提供的缓冲区
定义 Serializer.hpp:62
3. 编译运行
编写 CMakeLists.txt:
cmake_minimum_required(VERSION 3.20)
project(rpl_demo)
find_package(rpl REQUIRED)
add_executable(demo main.cpp)
target_link_libraries(demo PRIVATE rpl::rpl)
构建并运行:
mkdir build && cd build
cmake ..
make
./demo
恭喜!你已经成功运行了 RPL。接下来请阅读 集成指南 了解如何在嵌入式项目中使用。