C++
Windows
Linux
serialport

C++でクロスプラットフォームなシリアルポートのライブラリ作った

発端

 C++でシリアルポートのライブラリを探したがいいのがなかった。
 Siv3Dにあるがクロスプラットフォームに(まだ)対応してない。
  →じゃあ自分で作ろう

成果物

 やったぜ
 https://github.com/MurakamiShun/SerialPort

使用例

main.cpp
#include "Serial.hpp"
#include <vector>
#include <string>
#include <iostream>

using namespace std;

int main() {
    //デバイス一覧
    auto list = getSerialList();
    for (const auto& info : list) {
        cout << "device name:" << info.device_name() << endl;
        cout << "name:" << info.port() << "\n" << endl;
    }

    Serial serial;
    int port;
    cin >> port;
    //オープン
    if (!serial.open(list[port], 9600))
        return -1;
    //SerialInfo構造体にポート名とデバイス名が入っている
    SerialInfo info = serial.getInfo();
    cout << "open success" << endl;
    cout << "device name:" << info.device_name() << endl;
    cout << "name:" << info.port() << "\n" << endl;
    //以下ループ
    while (true) {
        auto v = serial.read();
        for (auto c : v) {
            cout << c;
        }
    }
    return 0;
}

使用するときの注意点

 ポート名とデバイスネームはWindwosとLinuxで違くなる。
 バッファが少ないから別のスレッドで処理するとかして、一杯にならないように。

ちょっと説明

 デバイスネームを取得する際、Windowsではフレンドリーネームなるものを取得。
 Linuxでは現在主流のUSB-UART変換だった場合にUSBのPIDとPIDを取得して、変換アダプタのベンダー名と製品名をデバイスネームとした。
 Serial::Configにパリティやらボーレートを設定してsetConfigすれば設定の変更ができる。
 あとはヘッダファイル見てください(言葉で説明するより早いと思う)