From c73028bb1bfe1063e85041e648515fbdc800803c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Mi=C5=A1i=C4=87?= Date: Fri, 19 Nov 2021 15:08:55 +0100 Subject: [PATCH] iridiumsbd: discard all pending data for flow control enabled --- src/drivers/telemetry/iridiumsbd/IridiumSBD.cpp | 12 +++++++++++- src/drivers/telemetry/iridiumsbd/IridiumSBD.h | 1 + 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/drivers/telemetry/iridiumsbd/IridiumSBD.cpp b/src/drivers/telemetry/iridiumsbd/IridiumSBD.cpp index 7b2760dc2a..95b72e4562 100644 --- a/src/drivers/telemetry/iridiumsbd/IridiumSBD.cpp +++ b/src/drivers/telemetry/iridiumsbd/IridiumSBD.cpp @@ -60,7 +60,7 @@ IridiumSBD::IridiumSBD() IridiumSBD::~IridiumSBD() { - ::close(_uart_fd); + deinit(); } int IridiumSBD::task_spawn(int argc, char *argv[]) @@ -214,6 +214,16 @@ int IridiumSBD::init(int argc, char *argv[]) return PX4_OK; } +void IridiumSBD::deinit() +{ + if (_uart_fd >= 0) { + /* discard all pending data, as close() might block otherwise on NuttX with flow control enabled */ + tcflush(_uart_fd, TCIOFLUSH); + ::close(_uart_fd); + _uart_fd = -1; + } +} + int IridiumSBD::print_status() { PX4_INFO("started"); diff --git a/src/drivers/telemetry/iridiumsbd/IridiumSBD.h b/src/drivers/telemetry/iridiumsbd/IridiumSBD.h index 75fecba0fc..efc2a5cf47 100644 --- a/src/drivers/telemetry/iridiumsbd/IridiumSBD.h +++ b/src/drivers/telemetry/iridiumsbd/IridiumSBD.h @@ -141,6 +141,7 @@ public: private: int init(int argc, char *argv[]); + void deinit(); /* * Loop executed while in SATCOM_STATE_STANDBY