сделал лог причины ошибки записи в serial порт, сделал счетчик для ошибок записи
This commit is contained in:
20
air/main.cpp
20
air/main.cpp
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user