#include <iostream>
#include <string>
#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#endif
class SerialPort {
public:
SerialPort(const std::string& portName, int baudRate) {
#ifdef _WIN32
// Windows平台下的串口初始化代码
hSerial = CreateFileA(portName.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hSerial == INVALID_HANDLE_VALUE) {
std::cerr << "Error opening serial port" << std::endl;
return;
}
DCB dcbSerialParams = { 0 };
dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
GetCommState(hSerial, &dcbSerialParams);
dcbSerialParams.BaudRate = baudRate;
dcbSerialParams.ByteSize = 8;
dcbSerialParams.StopBits = ONESTOPBIT;
dcbSerialParams.Parity = NOPARITY;
SetCommState(hSerial, &dcbSerialParams);
#else
// Linux平台下的串口初始化代码
fd = open(portName.c_str(), O_RDWR | O_NOCTTY | O_SYNC);
if (fd < 0) {
std::cerr << "Error opening serial port" << std::endl;
return;
}
struct termios tty;
memset(&tty, 0, sizeof(tty));
if (tcgetattr(fd, &tty) != 0) {
std::cerr << "Error from tcgetattr" << std::endl;
return;
}
cfsetospeed(&tty, baudRate);
cfsetispeed(&tty, baudRate);
tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; // 8-bit chars
tty.c_iflag &= ~IGNBRK; // disable break processing
tty.c_lflag = 0; // no signaling chars, no echo, no canonical processing
tty.c_oflag = 0; // no remapping, no delays
tty.c_cc[VMIN] = 0; // read doesn't block
tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout
tty.c_iflag &= ~(IXON | IXOFF | IXANY); // shut off xon/xoff ctrl
tty.c_cflag |= (CLOCAL | CREAD); // ignore modem controls, enable reading
tty.c_cflag &= ~(PARENB | PARODD); // shut off parity
tty.c_cflag |= 0; // set parity to none
tty.c_cflag &= ~CSTOPB; // 1 stop bit
tty.c_cflag &= ~CRTSCTS; // no hardware flowcontrol
if (tcsetattr(fd, TCSANOW, &tty) != 0) {
std::cerr << "Error from tcsetattr" << std::endl;
return;
}
#endif
}
~SerialPort() {
#ifdef _WIN32
if (hSerial != INVALID_HANDLE_VALUE) {
CloseHandle(hSerial);
}
#else
if (fd >= 0) {
close(fd);
}
#endif
}
bool writeData(const std::string& data) {
#ifdef _WIN32
DWORD bytesSent;
WriteFile(hSerial, data.c_str(), data.size(), &bytesSent, NULL);
return bytesSent == data.size();
#else
int bytesSent = write(fd, data.c_str(), data.size());
return bytesSent == data.size();
#endif
}
std::string readData(int numBytes) {
#ifdef _WIN32
DWORD bytesRead;
char buffer[numBytes];
ReadFile(hSerial, buffer, numBytes, &bytesRead, NULL);
return std::string(buffer, bytesRead);
#else
char buffer[numBytes];
int bytesRead = read(fd, buffer, numBytes);
return std::string(buffer, bytesRead);
#endif
}
private:
#ifdef _WIN32
HANDLE hSerial;
#else
int fd;
#endif
};
int main() {
SerialPort serial("/dev/ttyUSB0", B9600); // 替换为你的串口设备和波特率
if (!serial.writeData("Hello, World!\n")) {
std::cerr << "Failed to write to serial port" << std::endl;
return 1;
}
std::string response = serial.readData(100);
std::cout << "Received: " << response << std::endl;
return 0;
}
类 SerialPort
:封装了串口通信的初始化、读写操作。
writeData
方法:向串口发送数据。readData
方法:从串口读取指定数量的数据。main
函数:创建一个 SerialPort
对象,尝试发送一条消息并读取响应。
跨平台支持:
#ifdef _WIN32
来区分 Windows 和 Linux 系统,分别使用不同的 API 进行串口通信。CreateFileA
, WriteFile
, ReadFile
等 API。open
, write
, read
, tcsetattr
等系统调用。注意:
/dev/ttyUSB0
或 COM3
)和波特率进行调整。上一篇:mqtt c++
下一篇:c++获取时间戳
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站