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

yovking 2024-08-09 15:35:02 阅读 66

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

请添加图片描述

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

<code>#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)



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。