現在開発中の汎用通信ライブラリrogilinkFlexのSTM32F446実装です。(おそらくmbed OSならF446じゃなくても動きます。) UART通信とCAN通信に対応しています。従来のrogilinkに比べて、送受信するデータ型を柔軟に設定できるようになっており、データ変換も自動で行います。マイコン同士の通信、マイコンとros2の通信の両方に対応しています。
- rogilinkFlex-ros2
- rogilinkFlex-esp32 (動作未確認)
https://kra.kibe.la/notes/6148
#include "UartLink.hpp"
UartLink uart(TXピン, RXピン, ボーレート);
UartLinkPublisher<データ型1, データ型2, ...> pub(uart, フレームID); // publisherの設定
pub.send(データ1, データ2, ...);
UartLinkSubscriber<データ型1, データ型2, ...> sub(uart, フレームID); // subscriberの設定
void callback(データ型1, データ型2, ...) {
// コールバック関数
}
sub.set_callback(callback); // コールバック関数の設定
#include <mbed.h>
#include "UartLink.hpp"
UartLink uart(USBTX, USBRX, 115200); // UART通信の設定
UartLinkSubscriber<uint8_t, uint16_t, uint8_t> sub(uart, 1); // Subscriber(受信側)の設定
UartLinkPublisher<char*> pub(uart, 2); // Publisher(送信側)の設定
// Subscriberのコールバック関数
void sub_callback(uint8_t a, uint16_t b, uint8_t c) {
pub.printf("a: %d, b: %d, c: %d\n", a, b, c);
}
// main関数
int main() {
sub.set_callback(sub_callback);
}
受信処理をすべて割り込みで行うのが好ましくない場合、EventQueueを使って受信処理を行うことができます。
#include <mbed.h>
#include "UartLink.hpp"
EventQueue queue(32 * EVENTS_EVENT_SIZE);
UartLink uart(USBTX, USBRX, 115200, &queue); // UART通信の設定
UartLinkSubscriber<uint8_t, uint16_t, uint8_t> sub(uart, 1); // Subscriber(受信側)の設定
UartLinkPublisher<char*> pub(uart, 2); // Publisher(送信側)の設定
// Subscriberのコールバック関数
void sub_callback(uint8_t a, uint16_t b, uint8_t c) {
pub.printf("a: %d, b: %d, c: %d\n", a, b, c);
}
// main関数
int main() {
sub.set_callback(sub_callback);
queue.dispatch_forever();
}
CanLink uart(Rdピン, Tdピン, 周波数);
UART通信とほとんど同じなので省略します。UartLinkSubscriber, UartLinkPublisher
をCanLinkSubscriber, CanLinkPublisher
に置き換えるだけです。
デフォルトでは、送受信するデータ型として使えるのは、
int
,float
,char
,...などの基本型char*
型(文字列)
のみです。ただし、構造体やクラスなどの複合型を送受信する場合は、シリアライザ(送信時)、デシリアライザ(受信時)を設定することで可能になります。
struct Data {
int a;
float b;
char c;
// シリアライザ
void serialize(uint8_t* data) {
memcpy(data, &a, sizeof(int));
memcpy(data + sizeof(int), &b, sizeof(float));
memcpy(data + sizeof(int) + sizeof(float), &c, sizeof(char));
}
// デシリアライザ
void deserialize(const uint8_t* data, size_t* size) {
memcpy(&a, data, sizeof(int));
memcpy(&b, data + sizeof(int), sizeof(float));
memcpy(&c, data + sizeof(int) + sizeof(float), sizeof(char));
*size = sizeof(int) + sizeof(float) + sizeof(char);
};
};
UartLinkSubscriber<Data> sub(uart, 1); // Subscriber(受信側)の設定
シリアライザ・デシリアライザを設定しないとコンパイルエラーになります。