#include "port/poller.h" #include "port/uart.h" #include #include #include #include #include drivers::UartDriver::UartDriver(const std::string& path, int baud) { hCom = CreateFileA(path.c_str(), GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, nullptr); if (hCom == INVALID_HANDLE_VALUE) throw std::runtime_error("Cannot open UART port"); // Настройка DCB DCB dcb{}; dcb.DCBlength = sizeof(dcb); if (!GetCommState(hCom, &dcb)) throw std::runtime_error("GetCommState failed"); dcb.BaudRate = baud; dcb.ByteSize = 8; dcb.Parity = EVENPARITY; // 8E2 dcb.StopBits = TWOSTOPBITS; if (!SetCommState(hCom, &dcb)) throw std::runtime_error("SetCommState failed"); // Настройка событий winHandle = CreateEvent(nullptr, TRUE, FALSE, nullptr); if (!winHandle) throw std::runtime_error("CreateEvent failed"); if (!SetCommMask(hCom, EV_RXCHAR)) throw std::runtime_error("SetCommMask failed"); // Первый вызов WaitCommEvent в асинхронном режиме memset(&overlapped, 0, sizeof(overlapped)); overlapped.hEvent = winHandle; DWORD dummy; WaitCommEvent(hCom, &dummy, &overlapped); } bool drivers::UartDriver::writeData(std::span data) { DWORD written; OVERLAPPED ov{}; ov.hEvent = CreateEvent(nullptr, TRUE, FALSE, nullptr); bool ok = WriteFile(hCom, data.data(), (DWORD)data.size(), &written, &ov) || GetOverlappedResult(hCom, &ov, &written, TRUE); CloseHandle(ov.hEvent); return ok && written == data.size(); } size_t drivers::UartDriver::readChunk(std::vector& out) { out.resize(512); DWORD read = 0; OVERLAPPED ov{}; ov.hEvent = CreateEvent(nullptr, TRUE, FALSE, nullptr); bool ok = ReadFile(hCom, out.data(), (DWORD)out.size(), &read, &ov) || GetOverlappedResult(hCom, &ov, &read, TRUE); CloseHandle(ov.hEvent); out.resize(read); return read; } drivers::UartDriver::~UartDriver() { if (hCom != INVALID_HANDLE_VALUE) CloseHandle(hCom); if (winHandle) CloseHandle(winHandle); }