сделал лог причины ошибки записи в serial порт, сделал счетчик для ошибок записи
This commit is contained in:
20
air/main.cpp
20
air/main.cpp
@@ -177,7 +177,6 @@ struct SbusData {
|
|||||||
};
|
};
|
||||||
|
|
||||||
class SerialPort {
|
class SerialPort {
|
||||||
private:
|
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
public:
|
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;
|
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) {
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Принудительная отправка данных
|
// Принудительная отправка данных
|
||||||
if (drain() < 0) {
|
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 false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -288,6 +287,7 @@ int main(int argc, char* argv[]) {
|
|||||||
|
|
||||||
int packetCount = 0;
|
int packetCount = 0;
|
||||||
int totalPacketCount = 0;
|
int totalPacketCount = 0;
|
||||||
|
int serialErrors = 0;
|
||||||
int64_t lastStatisticsShow = milliseconds();
|
int64_t lastStatisticsShow = milliseconds();
|
||||||
while (true) {
|
while (true) {
|
||||||
pollfd udpFd{.fd = udp_server.sockfd, .events = POLLIN, .revents = 0};
|
pollfd udpFd{.fd = udp_server.sockfd, .events = POLLIN, .revents = 0};
|
||||||
@@ -323,7 +323,15 @@ int main(int argc, char* argv[]) {
|
|||||||
const auto now = milliseconds();
|
const auto now = milliseconds();
|
||||||
if (now - lastSbusWrite >= SBUS_SEND_FRAME_INTERVAL && now - lastSbusRecv <= SBUS_RXLOSS_INTERVAL) {
|
if (now - lastSbusWrite >= SBUS_SEND_FRAME_INTERVAL && now - lastSbusRecv <= SBUS_RXLOSS_INTERVAL) {
|
||||||
lastSbusWrite = now;
|
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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user