ページの作成:「== 概要 == QtSerialPortライブラリは、 Qtライブラリのアドオンモジュールであり、ハードウェアシリアルポートとバーチャルシリアルポートの両方に単一のインターフェースを提供する。<br> <br> シリアルインターフェースは、そのシンプルさと信頼性から、組み込みシステムやロボット開発等の業界ではよく使用されている。<br> <br> QtSerialPortライブラ…」
 
49行目: 49行目:


== データの受信 ==
== データの受信 ==
==== 同期式 ====
以下の例では、同期的にデータを受信している。<br>
以下の例では、同期的にデータを受信している。<br>
実用的な設計を行う場合は、信頼性と応答性を高めるために、シグナルおよびスロットを使用した非同期でデータを受信する方法が推奨される。<br>
実用的な設計を行う場合は、信頼性と応答性を高めるために、シグナルおよびスロットを使用した非同期でデータを受信する方法が推奨される。<br>
91行目: 92行目:
    
    
     return a.exec();
     return a.exec();
}
</syntaxhighlight>
<br>
==== 非同期 ====
非同期でデータを受信する場合、<code>QSerialPort</code>クラスのシグナルとスロットのメカニズムを使用する。<br>
これにより、データが受信された時に自動的に通知されて、アプリケーションのメインループをブロックすることなくデータを受信することができる。<br>
<br>
まず、<code>QObject</code>クラスを継承したクラスを定義する。<br>
シリアルポートからのデータの受信を管理するためのスロットを用意する。<br>
以下の例では、シリアルポートがデータを受信したことを検出するために、<code>readyRead</code>シグナルを使用している。<br>
<syntaxhighlight lang="c++">
// Sample.hファイル
#include <QCoreApplication>
#include <QSerialPort>
#include <QDebug>
class SerialPortReader : public QObject
{
    Q_OBJECT
public:
    SerialPortReader(QSerialPort *serialPort, QObject *parent = nullptr) : QObject(parent), m_serialPort(serialPort)
    {
      connect(m_serialPort, &QSerialPort::readyRead, this, &SerialPortReader::handleReadyRead);
    }
private slots:
    void handleReadyRead()
    {
      const QByteArray data = m_serialPort->readAll();
      qDebug() << "Recieved data : " << data;
    }
private:
    QSerialPort *m_serialPort;
};
</syntaxhighlight>
<br>
<syntaxhighlight lang="c++">
// Sample.cppファイル
#include <QCoreApplication>
#include <QSerialPort>
#include <QDebug>
int main(int argc, char *argv[])
{
    QCoreApplication app(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;
    }
    SerialPortReader reader(&serial);
    return app.exec();
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>