Qtの基礎 - シリアル通信

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
2024年2月27日 (火) 23:28時点におけるWiki (トーク | 投稿記録)による版 (ページの作成:「== 概要 == QtSerialPortライブラリは、 Qtライブラリのアドオンモジュールであり、ハードウェアシリアルポートとバーチャルシリアルポートの両方に単一のインターフェースを提供する。<br> <br> シリアルインターフェースは、そのシンプルさと信頼性から、組み込みシステムやロボット開発等の業界ではよく使用されている。<br> <br> QtSerialPortライブラ…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

概要

QtSerialPortライブラリは、 Qtライブラリのアドオンモジュールであり、ハードウェアシリアルポートとバーチャルシリアルポートの両方に単一のインターフェースを提供する。

シリアルインターフェースは、そのシンプルさと信頼性から、組み込みシステムやロボット開発等の業界ではよく使用されている。

QtSerialPortライブラリを使用することにより、開発者はシリアルインターフェイスへのアクセスが必要なQtアプリケーションの実装に必要な時間を大幅に短縮することができる。


データの送信

Qtのシリアルポートモジュールをプロジェクトファイルに追加する。

 QT += core serialport


以下の例では、ボーレートは9600[bps]、データビットは8[ビット]、パリティなし、ストップビットは1[ビット]の8N1で、シリアル通信を行っている。

 #include <QCoreApplication>
 #include <QSerialPort>
 #include <QSerialPortInfo>
 #include <QDebug>
 
 int main(int argc, char *argv[])
 {
    QCoreApplication a(argc, argv);
 
    QSerialPort serial;
    serial.setPortName("/dev/ttyUSB0");                // シリアルポート名 (環境に合わせて変更すること)
    serial.setBaudRate(QSerialPort::Baud9600);         // ボーレート 9600[bps]
    serial.setDataBits(QSerialPort::Data8);            // データビット 8[ビット]
    serial.setParity(QSerialPort::NoParity);           // パリティなし
    serial.setStopBits(QSerialPort::OneStop);          // ストップビット 1[ビット]
    serial.setFlowControl(QSerialPort::NoFlowControl); // フロー制御なし
 
    if (!serial.open(QIODevice::ReadWrite)) {
       qDebug() << "Could not open serial port : " << serial.errorString();
       return -1;
    }
 
    // データの送信
    QByteArray dataToSend = "Hello, Serial Port!";
    serial.write(dataToSend);
 
    serial.close();
  
    return a.exec();
 }



データの受信

以下の例では、同期的にデータを受信している。
実用的な設計を行う場合は、信頼性と応答性を高めるために、シグナルおよびスロットを使用した非同期でデータを受信する方法が推奨される。

 #include <QCoreApplication>
 #include <QSerialPort>
 #include <QSerialPortInfo>
 #include <QDebug>
 
 int main(int argc, char *argv[])
 {
    QCoreApplication a(argc, argv);
 
    QSerialPort serial;
    serial.setPortName("/dev/ttyUSB0");                // シリアルポート名 (環境に合わせて変更すること)
    serial.setBaudRate(QSerialPort::Baud9600);         // ボーレート 9600[bps]
    serial.setDataBits(QSerialPort::Data8);            // データビット 8[ビット]
    serial.setParity(QSerialPort::NoParity);           // パリティなし
    serial.setStopBits(QSerialPort::OneStop);          // ストップビット 1[ビット]
    serial.setFlowControl(QSerialPort::NoFlowControl); // フロー制御なし
 
    if (!serial.open(QIODevice::ReadWrite)) {
       qDebug() << "Could not open serial port : " << serial.errorString();
       return -1;
    }
 
    // データの受信 (同期式)
    // 非同期でデータを受信する方法を推奨する
    // 1[Sec]待機
    if (serial.waitForReadyRead(1000)) {
       QByteArray responseData = serial.readAll();
       while (serial.waitForReadyRead(10))
          responseData += serial.readAll();
 
       qDebug() << "Recieved data : " << responseData;
    }
    else {
       qDebug() << "Failed to recieve data";
    }
 
    serial.close();
  
    return a.exec();
 }