From 0a7db042f689308af0264f6a02b7c35410dc07ab Mon Sep 17 00:00:00 2001 From: Vladislav Ostapov Date: Tue, 13 Jan 2026 15:38:46 +0300 Subject: [PATCH] =?UTF-8?q?=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D0=BB?= =?UTF-8?q?=D0=BE=D0=B3=20=D0=BF=D1=80=D0=B8=D1=87=D0=B8=D0=BD=D1=8B=20?= =?UTF-8?q?=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20=D0=B7=D0=B0=D0=BF=D0=B8?= =?UTF-8?q?=D1=81=D0=B8=20=D0=B2=20serial=20=D0=BF=D0=BE=D1=80=D1=82,=20?= =?UTF-8?q?=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D1=81=D1=87=D0=B5=D1=82?= =?UTF-8?q?=D1=87=D0=B8=D0=BA=20=D0=B4=D0=BB=D1=8F=20=D0=BE=D1=88=D0=B8?= =?UTF-8?q?=D0=B1=D0=BE=D0=BA=20=D0=B7=D0=B0=D0=BF=D0=B8=D1=81=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- air/main.cpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/air/main.cpp b/air/main.cpp index a923bf9..0b0d476 100644 --- a/air/main.cpp +++ b/air/main.cpp @@ -177,7 +177,6 @@ struct SbusData { }; class SerialPort { -private: int fd; public: @@ -244,18 +243,18 @@ public: } // Метод для записи данных в порт - bool write(std::span data) { + bool writeBuffer(std::span data) { if (fd < 0) return false; - ssize_t written = ::write(fd, data.data(), data.size()); + ssize_t written = write(fd, data.data(), data.size()); if (written < 0) { - std::cerr << "Failed to write to serial port" << std::endl; + std::cerr << "Failed to write to serial port " << strerror(errno) << std::endl; return false; } // Принудительная отправка данных if (drain() < 0) { - std::cerr << "Failed to flush data to serial port" << std::endl; + std::cerr << "Failed to flush data to serial port" << strerror(errno) << std::endl; return false; } return true; @@ -288,6 +287,7 @@ int main(int argc, char* argv[]) { int packetCount = 0; int totalPacketCount = 0; + int serialErrors = 0; int64_t lastStatisticsShow = milliseconds(); while (true) { pollfd udpFd{.fd = udp_server.sockfd, .events = POLLIN, .revents = 0}; @@ -323,7 +323,15 @@ int main(int argc, char* argv[]) { const auto now = milliseconds(); if (now - lastSbusWrite >= SBUS_SEND_FRAME_INTERVAL && now - lastSbusRecv <= SBUS_RXLOSS_INTERVAL) { lastSbusWrite = now; - if (!serial.write(sb.binaryBuffer)) { + if (!serial.writeBuffer(sb.binaryBuffer)) { + serialErrors++; + } else { + serialErrors = 0; + } + + // после 50 ошибок дальше не будем пытаться что-то писать, ибо это бесполезно + if (serialErrors >= 50) { + std::cerr << "FATAL: 50 errors on serial port write operation, exit" << std::endl; break; } }