C++ 实现简单的串口通讯

C++ 实现简单的串口通讯

请添加图片描述

首先我们需要包含必要的头文件,然后定义串口通讯类:

#include <iostream>
#include <string>
#include <windows.h>

class SerialPort {
private:
    HANDLE hComm;  // 串口句柄
    DCB dcbSerialParams;  // 串口参数
    COMMTIMEOUTS timeouts;  // 超时参数

public:
    SerialPort();
    ~SerialPort();
    bool open(const std::string& portName, int baudRate);
    bool close();
    bool read(char* buffer, int bufferSize, int& bytesRead);
    bool write(const char* buffer, int bufferSize, int& bytesWritten);
};

这个类包含了打开和关闭串口,读写数据等基本功能。接下来实现这些成员函数:

SerialPort::SerialPort() {
    hComm = INVALID_HANDLE_VALUE;
    SecureZeroMemory(&dcbSerialParams, sizeof(DCB));
    SecureZeroMemory(&timeouts, sizeof(COMMTIMEOUTS));
}

SerialPort::~SerialPort() {
    close();
}

bool SerialPort::open(const std::string& portName, int baudRate) {
    hComm = CreateFileA(portName.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hComm == INVALID_HANDLE_VALUE) {
        std::cout << "无法打开串口!" << std::endl;
        return false;
    }

    dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
    if (!GetCommState(hComm, &dcbSerialParams)) {
        std::cout << "获取串口状态失败!" << std::endl;
        close();
        return false;
    }

    dcbSerialParams.BaudRate = baudRate;
    dcbSerialParams.ByteSize = 8;
    dcbSerialParams.StopBits = ONESTOPBIT;
    dcbSerialParams.Parity = NOPARITY;
    if (!SetCommState(hComm, &dcbSerialParams)) {
        std::cout << "设置串口状态失败!" << std::endl;
        close();
        return false;
    }

    timeouts.ReadIntervalTimeout = 50;
    timeouts.ReadTotalTimeoutConstant = 50;
    timeouts.ReadTotalTimeoutMultiplier = 10;
    timeouts.WriteTotalTimeoutConstant = 50;
    timeouts.WriteTotalTimeoutMultiplier = 10;
    if (!SetCommTimeouts(hComm, &timeouts)) {
        std::cout << "设置串口超时失败!" << std::endl;
        close();
        return false;
    }

    return true;
}

bool SerialPort::close() {
    if (hComm != INVALID_HANDLE_VALUE) {
        CloseHandle(hComm);
        hComm = INVALID_HANDLE_VALUE;
    }
    return true;
}

bool SerialPort::read(char* buffer, int bufferSize, int& bytesRead) {
    return ReadFile(hComm, buffer, bufferSize, (LPDWORD)&bytesRead, NULL);
}

bool SerialPort::write(const char* buffer, int bufferSize, int& bytesWritten) {
    return WriteFile(hComm, buffer, bufferSize, (LPDWORD)&bytesWritten, NULL);
}

这里我们使用Windows API实现了串口的打开、关闭以及读写操作。在open函数中,我们通过CreateFileA打开指定的串口,然后设置波特率、数据位、停止位和校验位等参数,并设置读写超时。

readwrite函数分别调用了ReadFileWriteFile来读写串口数据。

最后我们可以这样使用这个串口类:

int main() {
    SerialPort serialPort;
    if (serialPort.open("COM1", 9600)) {
        std::cout << "串口打开成功!" << std::endl;

        char writeBuffer[] = "Hello, Serial Port!";
        int bytesWritten;
        serialPort.write(writeBuffer, strlen(writeBuffer), bytesWritten);

        char readBuffer[256];
        int bytesRead;
        serialPort.read(readBuffer, sizeof(readBuffer), bytesRead);
        std::cout << "接收到数据: " << std::string(readBuffer, bytesRead) << std::endl;

        serialPort.close();
    }

    return 0;
}

以上就是一个基本的C++串口通讯实现啦,哥哥你学会了吗?(眨眼)

代码里用到了一些Windows API函数,需要在Windows环境下编译运行哦。如果是在Linux或macOS下的话,可以使用termios.h头文件提供的接口来操作串口。

总之串口通讯还是蛮有意思的,哥哥以后有机会多多尝试哦~

(可爱的结尾ing)那么今天的C++串口通讯就讲到这里啦!Nova相信聪明的哥哥一定都学会了吧,有任何问题随时来问可爱的Nova哦~让我们一起加油,成为C++大佬吧! 么么哒~(wink)