SerialPort C++
时间: 2023-10-19 16:53:19 浏览: 94
C++ 中可以通过 SerialPort 类来实现串口通信。SerialPort 类封装了串口的基本操作,如打开/关闭串口、设置串口参数、读/写数据等。
以下是一个简单的 SerialPort 类的实现,支持 Windows 和 Linux 平台:
```
#include <iostream>
#include <cstring>
#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#endif
class SerialPort {
public:
SerialPort(const char* portName, int baudRate) : fd(-1) {
#ifdef _WIN32
// 打开串口
fd = CreateFileA(portName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (fd == INVALID_HANDLE_VALUE) {
std::cerr << "Failed to open serial port " << portName << std::endl;
return;
}
// 配置串口
DCB dcbSerialParams = { 0 };
dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
if (!GetCommState(fd, &dcbSerialParams)) {
std::cerr << "Failed to get serial parameters" << std::endl;
CloseHandle(fd);
fd = -1;
return;
}
dcbSerialParams.BaudRate = baudRate;
dcbSerialParams.ByteSize = 8;
dcbSerialParams.StopBits = ONESTOPBIT;
dcbSerialParams.Parity = NOPARITY;
if (!SetCommState(fd, &dcbSerialParams)) {
std::cerr << "Failed to set serial parameters" << std::endl;
CloseHandle(fd);
fd = -1;
return;
}
// 配置超时
COMMTIMEOUTS timeouts = { 0 };
timeouts.ReadIntervalTimeout = 50;
timeouts.ReadTotalTimeoutConstant = 50;
timeouts.ReadTotalTimeoutMultiplier = 10;
timeouts.WriteTotalTimeoutConstant = 50;
timeouts.WriteTotalTimeoutMultiplier = 10;
if (!SetCommTimeouts(fd, &timeouts)) {
std::cerr << "Failed to set serial timeouts" << std::endl;
CloseHandle(fd);
fd = -1;
return;
}
#else
// 打开串口
fd = open(portName, O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1) {
std::cerr << "Failed to open serial port " << portName << std::endl;
return;
}
// 配置串口
struct termios options = { 0 };
tcgetattr(fd, &options);
cfsetispeed(&options, baudRate);
cfsetospeed(&options, baudRate);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~CRTSCTS;
options.c_iflag &= ~(IXON | IXOFF | IXANY);
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_oflag &= ~OPOST;
tcsetattr(fd, TCSANOW, &options);
tcflush(fd, TCIOFLUSH);
#endif
}
~SerialPort() {
if (
C++ 中有一个标准库,叫做 asio,它可以提供串口通信类。当使用C++编写串口通信时,可以使用SerialPort类来管理串口通信。该类提供了一组用于打开、关闭、读取和写入串口数据的方法。下面是一个使用SerialPort类的示例:
```cpp
#include <iostream>
#include <SerialPort.h>
int main()
{
SerialPort port("COM1", 9600); // 打开COM1端口,波特率为9600
if (!port.isOpen())
{
std::cout << "Failed to open port" << std::endl;
return 1;
}
char data[10] = "Hello";
port.write(data, sizeof(data)); // 向串口写入数据
char buffer[256];
int bytesRead = port.read(buffer, sizeof(buffer)); // 从串口读取数据
if (bytesRead > 0)
{
buffer[bytesRead] = '\0'; // 将读取的数据添加字符串结束符
std::cout << "Received: " << buffer << std::endl;
}
port.close(); // 关闭串口
return 0;
}
```
在上述示例中,SerialPort类的构造函数用于打开指定的串口。打开串口后,可以使用write()方法向串口写入数据,并使用read()方法从串口读取数据。在完成通信后,需要使用close()方法关闭串口。
阅读全文