сделал лог причины ошибки записи в serial порт, сделал счетчик для ошибок записи

This commit is contained in:
2026-01-13 15:38:46 +03:00
parent 5bd75b9d5d
commit 0a7db042f6

View File

@@ -177,7 +177,6 @@ struct SbusData {
};
class SerialPort {
private:
int fd;
public:
@@ -244,18 +243,18 @@ public:
}
// Метод для записи данных в порт
bool write(std::span<const uint8_t> data) {
bool writeBuffer(std::span<const uint8_t> 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;
}
}