「Qtの基礎 - シリアル通信」の版間の差分

ナビゲーションに移動 検索に移動
編集の要約なし
編集の要約なし
104行目: 104行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<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>
<br><br>
== データの送受信 ==
==== 非同期 ====
==== 非同期 ====
非同期でデータを受信する場合、<code>QSerialPort</code>クラスのシグナルとスロットのメカニズムを使用する。<br>
非同期でデータを受信する場合、<code>QSerialPort</code>クラスのシグナルとスロットのメカニズムを使用する。<br>

案内メニュー