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