【QtSerialPort(C++)でシリアル通信】UART(RS-232C)のTXとしてコマンドを送信する

C++

【対象の方】
・QtSerialPortを使ってコマンドを送信したい
・言語はC++

karitoke

UART(RS-232C)のTXとしてコマンドを送信する

Qtの『QtSerialPort』を使用してシリアル通信(RS-232C)のコマンド送信を実行する方法をまとめました。

開発環境

・OS : Windows10 64bit
・Qt Creator 4.14.2/Based on Qt 5.15.2 (MSVC 2019, 64 bit)

プロジェクトの作成

『ファイル/プロジェクトの新規作成』もしくはプロジェクトの『+New』を選択

プロジェクトの『Application(Qt)』→『Qt Widgets Application』→『選択…』を進みます。

名前は『serial_test』として(お好みで)『次へ』を選択します。以後は
・ビルドシステムの定義:qmake(デフォルト)で次へ
・Class Information:デフォルトで次へ
・Translation File:デフォルトで次へ

キットの選択で必ず『Desk top Qt 5.xx.x MinGW』を今回は選択して『次へ』を選択してください。

プロジェクトの管理はデフォルトのまま『完了』を選択してください。

プロジェクトエクスプローラーから『mainwindow.ui』を開いてください。

『Push Button』を1個ドラッグアンドドロップして配置してください。表記やオブジェクト名の変更等は今回は行いません。

『Push Button』を選択した状態で「右クリック→スロットへ移動…」を選択してください。

『released()』を選択して『OK』を押して下さい。

変更内容 ※次にコピペ用ソースコードがあります

『serial_test.pro』に以下を追記します

QT += serialport    #追加

『main.cpp』に以下を追記します

QT_USE_NAMESPACE    //追加

『mainwindow.cpp』に以下を追記します

//追加するヘッダーファイル
#include <QtCore/QCoreApplication>
#include <QtSerialPort/QSerialPort>

QtSerialでコマンドの送信を行うために必要な記述は以下です

QSerialPort port;        //ポートの宣言 portは他の名前でも可能です

port.setPortName("COM3");                           //COM3を使用
port.open(QIODevice::ReadWrite);                    //ポートの方向
port.setBaudRate(QSerialPort::Baud9600);            //ボーレート = 9600bps
port.setDataBits(QSerialPort::Data8);               //8byte
port.setParity(QSerialPort::NoParity);              //パリティなし
port.setStopBits(QSerialPort::OneStop);             //1ストップビット
port.setFlowControl(QSerialPort::NoFlowControl);    //フロー制御なし

port.write("a");                                    //aを送信

以下をそのままコピペすると実行できます。コピー先のファイル名は右上で確認をお願いします。

QT += core gui
QT += serialport    #追加

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    mainwindow.cpp

HEADERS += \
    mainwindow.h

FORMS += \
    mainwindow.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton_released();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"

#include <QApplication>

QT_USE_NAMESPACE    //追加

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QtCore/QCoreApplication>      //追加
#include <QtSerialPort/QSerialPort>     //追加

bool start = false;         //何度も初期設定をしないため1回だけ実行するためのフラグ
QSerialPort port;

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

//プッシュボタンを押したときに実行する処理
void MainWindow::on_pushButton_released()
{
    if (start == false)
    {
        port.setPortName("COM3");
        port.open(QIODevice::WriteOnly);
        port.setBaudRate(QSerialPort::Baud9600);
        port.setDataBits(QSerialPort::Data8);
        port.setParity(QSerialPort::NoParity);
        port.setStopBits(QSerialPort::OneStop);
        port.setFlowControl(QSerialPort::NoFlowControl);

        start = true;
    }

    port.write("a");

}

ビルドおよび動作確認

『実行』を選択してください。

『Save All』を選択してください。

『Push Button』をクリックするとボーレート9600bpsのコマンド「a」が出力されます。

参考:受信側で使用したArduinoのスケッチ

void setup()
{
    Serial.begin(9600);
    pinMode(8, OUTPUT);
}

void loop()
{
    byte key;
    
    if (Serial.available())
    {
        key = Serial.read();
        {
            if (key == 'a')
            {
                digitalWrite(8, HIGH);
                delay(500);
                digitalWrite(8, LOW);
            }
        }
    }
}