MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
Qtの基礎 - シリアル通信のソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
Qtの基礎 - シリアル通信
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == QtSerialPortライブラリは、 Qtライブラリのアドオンモジュールであり、ハードウェアシリアルポートとバーチャルシリアルポートの両方に単一のインターフェースを提供する。<br> <br> シリアルインターフェースは、そのシンプルさと信頼性から、組み込みシステムやロボット開発等の業界ではよく使用されている。<br> <br> QtSerialPortライブラリを使用することにより、開発者はシリアルインターフェイスへのアクセスが必要なQtアプリケーションの実装に必要な時間を大幅に短縮することができる。<br> <br><br> == データの送信 == Qtのシリアルポートモジュールをプロジェクトファイルに追加する。<br> <syntaxhighlight lang="make"> # QMake QT += core serialport </syntaxhighlight> <br> <syntaxhighlight lang="cmake"> # CMake find_package(Qt6 REQUIRED COMPONENTS SerialPort) target_link_libraries(mytarget PRIVATE Qt6::SerialPort) </syntaxhighlight> <br> 以下の例では、ボーレートは9600[bps]、データビットは8[ビット]、パリティなし、ストップビットは1[ビット]の8N1で、シリアル通信を行っている。<br> <syntaxhighlight lang="c++"> #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(); } </syntaxhighlight> <br><br> == データの受信 == ==== 同期式 ==== 以下の例では、同期的にデータを受信している。<br> 実用的な設計を行う場合は、信頼性と応答性を高めるために、シグナルおよびスロットを使用した非同期でデータを受信する方法が推奨される。<br> <syntaxhighlight lang="c++"> #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(); } </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> <br><br> __FORCETOC__ [[カテゴリ:Qt]]
Qtの基礎 - シリアル通信
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse