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)

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要编写串口通讯程序,需要使用C++中的串口库。下面是一个简单的示例代码,可以实现串口的打开、配置、发送和接收: ```c++ #include <iostream> #include <cstring> #include <termios.h> #include <fcntl.h> #include <unistd.h> using namespace std; int main() { int fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY); if (fd == -1) { cerr << "Error: Unable to open serial port." << endl; return 1; } struct termios options; tcgetattr(fd, &options); options.c_cflag = B9600 | CS8 | CLOCAL | CREAD; options.c_iflag = 0; options.c_oflag = 0; options.c_lflag = 0; tcflush(fd, TCIFLUSH); tcsetattr(fd, TCSANOW, &options); char buffer[255] = "Hello, world!"; int len = strlen(buffer); int n = write(fd, buffer, len); if (n != len) { cerr << "Error: Unable to write to serial port." << endl; return 1; } char response[255]; n = read(fd, response, 255); if (n == -1) { cerr << "Error: Unable to read from serial port." << endl; return 1; } response[n] = '\0'; cout << "Received: " << response << endl; close(fd); return 0; } ``` 在上面的代码中,我们使用了Linux系统中的串口设备文件`/dev/ttyS0`,如果你使用的是Windows系统,需要使用COM端口号代替。我们首先打开串口设备文件,并配置串口的波特率、数据位、停止位和校验位等参数。然后,我们向串口发送一个字符串,并等待接收串口返回的响应。最后,我们关闭串口设备文件。 需要注意的是,串口通讯是一种低级别的通讯方式,容易出现各种错误,因此编写串口程序需要非常小心谨慎,尤其是在处理串口返回数据时,需要考虑各种可能的情况,确保程序的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值