C++ RS-232C通信制御プログラム

指定されたシリアルポート(COM1)を開き、指定されたボーレート(9600bps)で通信を行います。指定されたデータを送信し、受信したデータを取得して表示します。必要に応じてポート名やボーレートを変更してください。
#include <iostream>
#include <Windows.h>
// シリアルポートを開く関数
HANDLE openSerialPort(const char* portName, DWORD baudRate) {
    HANDLE hSerial = CreateFile(portName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
    if (hSerial == INVALID_HANDLE_VALUE) {
        std::cerr << "Failed to open serial port." << std::endl;
        return NULL;
    }
    DCB dcbSerialParams = { 0 };
    dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
    if (!GetCommState(hSerial, &dcbSerialParams)) {
        std::cerr << "Failed to get serial port parameters." << std::endl;
        CloseHandle(hSerial);
        return NULL;
    }
    dcbSerialParams.BaudRate = baudRate;
    dcbSerialParams.ByteSize = 8;
    dcbSerialParams.StopBits = ONESTOPBIT;
    dcbSerialParams.Parity = NOPARITY;
    if (!SetCommState(hSerial, &dcbSerialParams)) {
        std::cerr << "Failed to set serial port parameters." << std::endl;
        CloseHandle(hSerial);
        return NULL;
    }
    COMMTIMEOUTS timeouts = { 0 };
    timeouts.ReadIntervalTimeout = 50;
    timeouts.ReadTotalTimeoutConstant = 50;
    timeouts.ReadTotalTimeoutMultiplier = 10;
    timeouts.WriteTotalTimeoutConstant = 50;
    timeouts.WriteTotalTimeoutMultiplier = 10;
    if (!SetCommTimeouts(hSerial, &timeouts)) {
        std::cerr << "Failed to set serial port timeouts." << std::endl;
        CloseHandle(hSerial);
        return NULL;
    }
    return hSerial;
}
// シリアルポートをクローズする関数
void closeSerialPort(HANDLE hSerial) {
    if (hSerial != INVALID_HANDLE_VALUE) {
        CloseHandle(hSerial);
    }
}
// データを送信する関数
bool sendData(HANDLE hSerial, const char* data, DWORD dataSize) {
    DWORD dwBytesWritten;
    if (!WriteFile(hSerial, data, dataSize, &dwBytesWritten, NULL)) {
        std::cerr << "Failed to write to serial port." << std::endl;
        return false;
    }
    return true;
}
// データを受信する関数
bool receiveData(HANDLE hSerial, char* buffer, DWORD bufferSize) {
    DWORD dwBytesRead;
    if (!ReadFile(hSerial, buffer, bufferSize, &dwBytesRead, NULL)) {
        std::cerr << "Failed to read from serial port." << std::endl;
        return false;
    }
    return true;
}
int main() {
    const char* portName = "COM1";
    const DWORD baudRate = CBR_9600;
    HANDLE hSerial = openSerialPort(portName, baudRate);
    if (hSerial == NULL) {
        std::cerr << "Failed to open serial port." << std::endl;
        return 1;
    }
    const char* sendDataStr = "Hello, RS-232C!";
    if (sendData(hSerial, sendDataStr, strlen(sendDataStr))) {
        std::cout << "Data sent: " << sendDataStr << std::endl;
    }
    char receiveBuffer[256];
    if (receiveData(hSerial, receiveBuffer, sizeof(receiveBuffer))) {
        std::cout << "Data received: " << receiveBuffer << std::endl;
    }
    closeSerialPort(hSerial);
    return 0;
}