diff --git a/drivers/Serial.cpp b/drivers/Serial.cpp index 8e3ce518a53..7f0dcab8229 100644 --- a/drivers/Serial.cpp +++ b/drivers/Serial.cpp @@ -15,6 +15,7 @@ */ #include "drivers/Serial.h" #include "platform/mbed_wait_api.h" +#include "platform/mbed_critical.h" #if DEVICE_SERIAL @@ -36,12 +37,42 @@ int Serial::_putc(int c) { return _base_putc(c); } +int Serial::getc() { + // Mutex is already held + if(!core_util_is_isr_active()) + { + return Stream::getc(); + } + else + { + return _base_getc(); + } +} + +int Serial::putc(int c) { + // Mutex is already held + if(!core_util_is_isr_active()) + { + return Stream::putc(c); + } + else + { + return _base_putc(c); + } +} + void Serial::lock() { - _mutex.lock(); + if(!core_util_is_isr_active()) + { + _mutex.lock(); + } } void Serial::unlock() { - _mutex.unlock(); + if(!core_util_is_isr_active()) + { + _mutex.unlock(); + } } } // namespace mbed diff --git a/drivers/Serial.h b/drivers/Serial.h index 549943a47c0..296b4b69aea 100644 --- a/drivers/Serial.h +++ b/drivers/Serial.h @@ -98,6 +98,8 @@ class Serial : public SerialBase, public Stream, private NonCopyable { { return SerialBase::writeable(); } + int getc(); + int putc(int c); protected: virtual int _getc(); diff --git a/drivers/SerialBase.cpp b/drivers/SerialBase.cpp index 5ec47ff83a6..ee0a2279b64 100644 --- a/drivers/SerialBase.cpp +++ b/drivers/SerialBase.cpp @@ -55,7 +55,8 @@ void SerialBase::format(int bits, Parity parity, int stop_bits) { int SerialBase::readable() { lock(); - int ret = serial_readable(&_serial); + int ret = 0; + ret = serial_readable(&_serial); unlock(); return ret; } @@ -63,7 +64,8 @@ int SerialBase::readable() { int SerialBase::writeable() { lock(); - int ret = serial_writable(&_serial); + int ret = 0; + ret = serial_writable(&_serial); unlock(); return ret; }