GKD.RoboCtrl
载入中...
搜索中...
未找到
serial.cpp
1#include "io/serial.h"
2#include "asio/completion_condition.hpp"
3#include "asio/read.hpp"
4#include "core/async.hpp"
5#include "io/base.hpp"
6#include "utils/utils.hpp"
7
8#include <cstddef>
9#include <cstdint>
10#include <memory>
11#include <string>
12
13using namespace roboctrl::io;
14
17 port_{roboctrl::io_context()},
18 info_{info}
19{
20 port_.open(std::string(info.device));
21 port_.set_option(asio::serial_port_base::baud_rate(info.baud_rate));
22 port_.set_option(asio::serial_port_base::character_size(8));
23 port_.set_option(asio::serial_port_base::parity(asio::serial_port_base::parity::none));
24 port_.set_option(asio::serial_port_base::stop_bits(asio::serial_port_base::stop_bits::one));
25 port_.set_option(asio::serial_port_base::flow_control(asio::serial_port_base::flow_control::none));
26
27 roboctrl::spawn(task());
28}
29
31{
32 co_await asio::async_write(port_, asio::buffer(data), asio::use_awaitable);
33}
34
35roboctrl::awaitable<void> serial::read_n(size_t size){
36 co_await asio::async_read(
37 port_,
38 asio::buffer(buffer_),
39 asio::transfer_exactly(size),
40 asio::use_awaitable
41 );
42}
43
45{
46 while(true){
47 uint16_t header = co_await read<uint16_t>();
48
49 if(header == 0xAA55){
50 uint8_t key = co_await read<uint8_t>();
51 auto len = package_size(key);
52 co_await read_n(len);
53 dispatch(key, byte_span{buffer_.data(),len});
54 }
55 }
56}
57
异步任务上下文组件。
带 key 的 IO 基类,根据键值派发数据。
Definition base.hpp:120
void dispatch(const uint8_t &key, byte_span data)
将数据派发给对应 key 的回调。
Definition base.hpp:152
awaitable< void > send(key_type key, byte_span data)
发送字节数据。
Definition serial.cpp:30
serial(info_type info)
打开并配置串口。
Definition serial.cpp:15
awaitable< void > task()
接收循环任务。
Definition serial.cpp:44
IO的基础组件。
std::span< std::byte > byte_span
byte span,实际上就是一个std::span<std::byte>;
Definition base.hpp:42
auto spawn(task_context::task_type &&task)
添加一个协程任务到全局任务上下文中执行。
Definition async.hpp:151
asio::awaitable< T > awaitable
协程任务类型。
Definition async.hpp:42
auto & io_context()
获取全局任务上下文的io_context。
Definition async.hpp:218
串口裸 IO 封装。
串口初始化参数。
Definition serial.h:33
常用数值与字节工具集合。