diff --git a/drivers/RawSerial.cpp b/drivers/RawSerial.cpp index b473fddae4..1424c6c9af 100644 --- a/drivers/RawSerial.cpp +++ b/drivers/RawSerial.cpp @@ -63,9 +63,16 @@ int RawSerial::puts(const char *str) // length is above a certain threshold, otherwise we use just the stack. int RawSerial::printf(const char *format, ...) { - lock(); std::va_list arg; va_start(arg, format); + int len = this->vprintf(format, arg); + va_end(arg); + return len; +} + +int RawSerial::vprintf(const char *format, std::va_list arg) +{ + lock(); // ARMCC microlib does not properly handle a size of 0. // As a workaround supply a dummy buffer with a size of 1. char dummy_buf[1]; @@ -80,7 +87,6 @@ int RawSerial::printf(const char *format, ...) puts(temp); delete[] temp; } - va_end(arg); unlock(); return len; } diff --git a/drivers/RawSerial.h b/drivers/RawSerial.h index 4841eb9038..0e6c9c7c8f 100644 --- a/drivers/RawSerial.h +++ b/drivers/RawSerial.h @@ -25,6 +25,7 @@ #include "drivers/SerialBase.h" #include "hal/serial_api.h" #include "platform/NonCopyable.h" +#include namespace mbed { /** \addtogroup drivers */ @@ -89,6 +90,7 @@ public: int puts(const char *str); int printf(const char *format, ...) MBED_PRINTF_METHOD(1, 2); + int vprintf(const char *format, std::va_list arg); #if !(DOXYGEN_ONLY) protected: