LoginSignup
20
14

More than 5 years have passed since last update.

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

Posted at

発端

 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すれば設定の変更ができる。
 あとはヘッダファイル見てください(言葉で説明するより早いと思う)

20
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
14