Qtを用いたファイル読み込みとシリアルポート送信方法

Qtを使用してファイルを読み込みシリアルポートを介してデータを送信する方法について説明します。この例では、QFileを用いてファイル内容を読み取り、QSerialPortを用いてシリアル通信を行います。

以下は基本的な動作例です。

#include <QCoreApplication>
#include <QFile>
#include <QSerialPort>
#include <QSerialPortInfo>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    // シリアルポートの設定
    QSerialPort comPort;
    comPort.setPortName("COM1");  // 使用するポート名を指定
    comPort.setBaudRate(QSerialPort::Baud9600);  // ボードレートを設定
    comPort.setDataBits(QSerialPort::Data8);  // データビット数を設定
    comPort.setParity(QSerialPort::NoParity);  // パリティ設定
    comPort.setStopBits(QSerialPort::OneStop);  // ストップビット数を設定

    // シリアルポートを開く
    if (comPort.open(QIODevice::ReadWrite)) {
        qInfo() << "シリアルポートを開きました。";

        // ファイルを読み込む
        QFile file("送信ファイル.txt");
        if (file.open(QIODevice::ReadOnly)) {
            QByteArray sendData = file.readAll();

            // データを送信
            comPort.write(sendData);
            comPort.waitForBytesWritten();

            qInfo() << "データを送信しました。";

            // ファイルを閉じる
            file.close();
        } else {
            qInfo() << "ファイルを開けませんでした。";
        }

        // シリアルポートを閉じる
        comPort.close();
        qInfo() << "シリアルポートを閉じました。";
    } else {
        qInfo() << "シリアルポートを開けれませんでした。";
    }

    return app.exec();
}

上記コードのシリアルポート名("COM1")とファイル名("送信ファイル.txt")を実際の環境に合わせて変更してください。

GUIを用いてファイル内容を表示しシリアル送信を行う場合は、以下のようなコードを使用できます。

#include <QCoreApplication>
#include <QFile>
#include <QSerialPort>
#include <QTextEdit>
#include <QPushButton>
#include <QVBoxLayout>
#include <QFileDialog>
#include <QDir>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    // ウィンドウを作成
    QWidget window;
    QVBoxLayout layout(&window);

    // テキスト表示エリアを作成
    QTextEdit textView;
    layout.addWidget(&textView);

    // 開くボタンを作成
    QPushButton openBtn("ファイルを開く");
    layout.addWidget(&openBtn);

    // 送信ボタンを作成
    QPushButton sendBtn("シリアル送信");
    layout.addWidget(&sendBtn);

    // シリアルポートの設定
    QSerialPort comPort;
    comPort.setPortName("COM1");  // 使用するポート名を指定
    comPort.setBaudRate(QSerialPort::Baud9600);  // ボードレートを設定
    comPort.setDataBits(QSerialPort::Data8);  // データビット数を設定
    comPort.setParity(QSerialPort::NoParity);  // パリティ設定
    comPort.setStopBits(QSerialPort::OneStop);  // ストップビット数を設定

    // ファイルを開く処理
    QObject::connect(&openBtn, &QPushButton::clicked, [&]() {
        QString filePath = QFileDialog::getOpenFileName(
            nullptr, 
            "送信するファイルを選択", 
            QDir::homePath(), 
            "テキストファイル (*.txt);;すべてのファイル (*)"
        );

        if (!filePath.isEmpty()) {
            QFile file(filePath);
            if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
                QTextStream stream(&file);
                textView.setPlainText(stream.readAll());
                file.close();
            }
        }
    });

    // シリアル送信処理
    QObject::connect(&sendBtn, &QPushButton::clicked, [&]() {
        // 送信するデータを取得
        QString sendData = textView.toPlainText();

        // シリアルポートを開く
        if (comPort.open(QIODevice::ReadWrite)) {
            qInfo() << "シリアルポートを開きました。";

            // データを送信
            comPort.write(sendData.toUtf8());
            comPort.waitForBytesWritten();

            qInfo() << "データを送信しました。";

            // シリアルポートを閉じる
            comPort.close();
            qInfo() << "シリアルポートを閉じました。";
        } else {
            qInfo() << "シリアルポートを開けれませんでした。";
        }
    });

    // ウィンドウを表示
    window.show();

    return app.exec();
}

この例では、ファイル選択ダイアログを使用して送信するファイルを選択し、内容を表示した後にシリアル送信を行います。

タグ: Qt QSerialPort qfile

6月30日 23:14 投稿