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
打开指定的串口,然后设置波特率、数据位、停止位和校验位等参数,并设置读写超时。
read
和write
函数分别调用了ReadFile
和WriteFile
来读写串口数据。
最后我们可以这样使用这个串口类:
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)
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。