C++ RS-232C通信制御プログラム(パート2)

<RS232C.cpp>

#include <iostream>
#include "SerialPort.h" // シリアルポートクラスのヘッダーファイルをインクルード
int main() {
    // シリアルポート設定(ポート、データビット長、パリティチェック、ストップビッチ長)
    SerialPort serial(TEXT("COM1"), CBR_9600, 8, EVENPARITY, ONESTOPBIT);
    // シリアルポートが正常に開かれたか確認
    if (!serial.isConnected()) {
        //std::cerr <<  << std::endl;
        printf("Cannot Initialize SIO port [%s].\n","COM1");
        return 1;
    }
    // メッセージの送信
    std::string message = "Hello, Serial Port!";
    serial.TxCommand(message.c_str(), message.size());
    // データの受信
    char incomingData[256] = { 0 };
    serial.RxCommand(incomingData, sizeof(incomingData));
    // 受信したデータを表示
    std::cout << "Received data: " << incomingData << std::endl;
    return 0;
}

<COM.cpp>

#include "SerialPort.h"
#include <iostream>
#include <windows.h>
// シリアルポートのオープン
SerialPort::SerialPort(const TCHAR* portName, DWORD baudRate, BYTE byteSize, BYTE parity, BYTE stopBits) {
    hSerial = CreateFile(
        portName,
        GENERIC_READ | GENERIC_WRITE,
        0,
        NULL,
        OPEN_EXISTING,
        0,
        NULL
    );
    // シリアルポートの設定
    if (hSerial != INVALID_HANDLE_VALUE) {
        DCB dcbSerialParams = { 0 };
        dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
        GetCommState(hSerial, &dcbSerialParams);
        dcbSerialParams.BaudRate = baudRate;
        dcbSerialParams.ByteSize = byteSize;
        dcbSerialParams.Parity = parity;
        dcbSerialParams.StopBits = stopBits;
        SetCommState(hSerial, &dcbSerialParams);
        connected = true;
    }
    else {
        std::cerr << "Error: Unable to open COM port." << std::endl;
        connected = false;
    }
}
SerialPort::~SerialPort() {
    if (hSerial != INVALID_HANDLE_VALUE) {
        CloseHandle(hSerial);
    }
}
bool SerialPort::TxCommand(const char* buffer, unsigned int bufferSize) {
    DWORD bytesWritten;
    if (!WriteFile(hSerial, (void*)buffer, bufferSize, &bytesWritten, NULL)) {
        std::cerr << "Error: Unable to write to COM port." << std::endl;
        return false;
    }
    return true;
}
bool SerialPort::RxCommand(char* buffer, unsigned int bufferSize) {
    DWORD bytesRead;
    if (!ReadFile(hSerial, buffer, bufferSize, &bytesRead, NULL)) {
        std::cerr << "Error: Unable to read from COM port." << std::endl;
        return false;
    }
    return true;
}
bool SerialPort::isConnected() {
    return connected;
}

<SerialPort.h>

#include <Windows.h>
class SerialPort {
public:
    // コンストラク
    SerialPort(const TCHAR* portName, DWORD baudRate, BYTE byteSize, BYTE parity, BYTE stopBits);
    // デストラク
    ~SerialPort();
    // データ送信
    bool TxCommand(const char* buffer, unsigned int bufferSize);
    // データ受信
    bool RxCommand(char* buffer, unsigned int bufferSize);
    // 接続確認
    bool isConnected();
private:
    HANDLE hSerial;
    bool connected;
};