2016年11月30日水曜日

ArduinoでHardwareSerialもSoftwareSerialもサポートする関数やクラスを作る方法


既存のシリアルをラップするライブラリを作りました。

https://github.com/asukiaaa/SomeSerial

Arduino IDEのリストに登録してもらったので、ライブラリマネージャからインストールできます。
この記事では個人的に嬉しいことと便利だと思う使い方を紹介します。

SomeSerialを使うと嬉しいこと

  • HardwareSerial、SoftwareSerial、USBAPI Serial_を同じ呼び出し方で使えます。
  • 種類が違うシリアルに対応する関数やクラスが作れます。

複数種類のシリアルに対応する関数の作り方

シリアルで何かを出力する関数を例に説明します。

今まではシリアルの種類が違うと、それぞれ別の関数を作る必要がありました。
void printInfo(HardwareSerial* hardSerial) {
  hardSerial->println("some infomation");
}
void printInfo(SoftwareSerial* softSerial) {
  softSerial->println("some infomation");
}

SomeSerialを使うと、処理を共有化できるので、冗長な記述を減らせます。
void printInfo(HardwareSerial* hardSerial) {
  printInfo(new SomeSerial(hardSerial));
}
void printInfo(SoftwareSerial* softSerial) {
  printInfo(new SomeSerial(softSerial));
}
void printInfo(SomeSerial* someSerial) {
  someSerial->println("some information");
}

複数種類のシリアルに対応すうるクラスの作り方

HardwareSerialとSoftwareSerialのどれか一つしか対応していないクラスはよくあります。
#include <Arduino.h>
#include <SoftwareSerial.h>

class SomeCommunicationClass {
  public:
  SomeCommunicationClass(int rx, int tx);
  ..
  private:
  SoftwareSerial* thisSerial;
};

SomeCommunicationClass::SomeCommunicationClass(int rx, int tx) {
  thisSerial = new SoftwareSerial(rx, tx);
}

これが、SomeSerialを使うと複数種類のシリアルに対応するクラスが作れます。
#include <SomeSerial.h>
#include <Arduino.h>

class SomeCommunicationClass {
  public:
  SomeCommunicationClass(int rx, int tx);
  SomeCommunicationClass(HardwareSerial* hardSerial);
#ifdef USBCON
  SomeCommunicationClass(Serial_* usbSerial);
#endif
  private:
  SomeSerial* thisSerial;
};

SomeCommunicationClass::SomeCommunicationClass(int rx, int tx) {
  thisSerial = new SomeSerial(rx, tx);
}

SomeCommunicationClass::SomeCommunicationClass(HardwareSerial* hardSerial) {
  thisSerial = new SomeSerial(hardSerial);
}

#ifdef USBCON
SomeCommunicationClass::SomeCommunicationClass(Serial_* usbSerial) {
  thisSerial = new SomeSerial(usbSerial);
}
#endif

ライブラリで定義するクラスをこのように書けば、複数種類のシリアルに対応するライブラリが作れます。

説明は以上です。
いかがでしょう?
もし良かったら使ってみてください。

参考

SomeSerialのライブラリです。
https://github.com/asukiaaa/SomeSerial

更新履歴

2019.03.23
ライブラリで定義していた「__USB_SERIAL_AVAILABLE__ 」をArduinoで定義されている「USBCON」に置き換えました。

0 件のコメント :