class SerialPort {
//广州视觉芯
public:
SerialPort() : m_hSerial(NULL), m_bConnected(false) {}
~SerialPort() { }
bool Connect(const std::string& portName, DWORD baudRate) {
m_hSerial = CreateFileA(portName.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (m_hSerial == INVALID_HANDLE_VALUE) {
std::cerr << "Error: Could not open serial port." << std::endl;
return false;
}
DCB dcbSerialParams = { 0 };
dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
if (!GetCommState(m_hSerial, &dcbSerialParams)) {
std::cerr << "Error: Could not get serial port settings." << std::endl;
CloseHandle(m_hSerial);
return false;
}
dcbSerialParams.BaudRate = baudRate;
dcbSerialParams.ByteSize = 8;
dcbSerialParams.StopBits = ONESTOPBIT;
dcbSerialParams.Parity = NOPARITY;
if (!SetCommState(m_hSerial, &dcbSerialParams)) {
std::cerr << "Error: Could not set serial port settings." << std::endl;
CloseHandle(m_hSerial);
return false;
}
COMMTIMEOUTS timeouts = { 0 };
timeouts.ReadIntervalTimeout = 50;
timeouts.ReadTotalTimeoutConstant = 50;
timeouts.ReadTotalTimeoutMultiplier = 10;
timeouts.WriteTotalTimeoutConstant = 50;
timeouts.WriteTotalTimeoutMultiplier = 10;
if (!SetCommTimeouts(m_hSerial, &timeouts)) {
std::cerr << "Error: Could not set serial port timeouts." << std::endl;
CloseHandle(m_hSerial);
return false;
}
m_bConnected = true;
return true;
}
void CRC16(byte* bytes, DWORD numberOfBytes, byte* CRC_L, byte* CRC_H)
{
unsigned short crc = 0xffff;
for (DWORD i = 0; i < numberOfBytes; i++)
{
crc = crc ^ bytes[i];
for (int n = 0; n < 8; n++)
{
if ((crc & 0x0001) == 1)
{
crc = crc >> 1;
crc = crc ^ 0xa001;
}
else
{
crc = crc >> 1;
}
}
}
*CRC_L = crc;
*CRC_H = crc >> 8;
}
void Disconnect() {
if (m_bConnected) {
CloseHandle(m_hSerial);
m_bConnected = false;
}
}
bool IsConnected() const { return m_bConnected; }
bool Write(void* data, DWORD dataSize) {
if (!m_bConnected) {
std::cerr << "Error: Serial port not connected." << std::endl;
return false;
}
byte* cmd = new byte[dataSize + 2];
memcpy(cmd, data, dataSize);
CRC16(cmd, dataSize, &cmd[dataSize], &cmd[dataSize + 1]);
dataSize = dataSize + 2;
DWORD bytesWritten;
if (!WriteFile(m_hSerial, cmd, dataSize, &bytesWritten, NULL)) {
std::cerr << "Error: Could not write to serial port." << std::endl;
delete cmd;
return false;
}
delete cmd;
return true;
}
bool Read(void* buffer, DWORD bufferSize, DWORD& bytesRead) {
if (!m_bConnected) {
std::cerr << "Error: Serial port not connected." << std::endl;
return false;
}
if (!ReadFile(m_hSerial, buffer, bufferSize, &bytesRead, NULL)) {
std::cerr << "Error: Could not read from serial port." << std::endl;
return false;
}
return true;
}
private:
HANDLE m_hSerial;
bool m_bConnected;
};