mirror of https://github.com/ARMmbed/mbed-os.git
Added preliminary printf() support to RawSerial
parent
e162e96245
commit
5f62a399db
|
@ -71,6 +71,16 @@ public:
|
|||
* @returns The char read from the serial port
|
||||
*/
|
||||
int getc();
|
||||
|
||||
/** Write a string to the serial port
|
||||
*
|
||||
* @param str The string to write
|
||||
*
|
||||
* @returns 0 if the write succeeds, EOF for error
|
||||
*/
|
||||
int puts(const char *str);
|
||||
|
||||
int printf(const char *format, ...);
|
||||
};
|
||||
|
||||
} // namespace mbed
|
||||
|
|
|
@ -15,9 +15,12 @@
|
|||
*/
|
||||
#include "RawSerial.h"
|
||||
#include "wait_api.h"
|
||||
#include <cstdarg>
|
||||
|
||||
#if DEVICE_SERIAL
|
||||
|
||||
#define STRING_STACK_LIMIT 120
|
||||
|
||||
namespace mbed {
|
||||
|
||||
RawSerial::RawSerial(PinName tx, PinName rx) : SerialBase(tx, rx) {
|
||||
|
@ -31,6 +34,34 @@ int RawSerial::putc(int c) {
|
|||
return _base_putc(c);
|
||||
}
|
||||
|
||||
int RawSerial::puts(const char *str) {
|
||||
while (*str)
|
||||
putc(*str ++);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Experimental support for printf in RawSerial. No Stream inheritance
|
||||
// means we can't call printf() directly, so we use sprintf() instead.
|
||||
// We only call malloc() for the sprintf() buffer if the buffer
|
||||
// length is above a certain threshold, otherwise we use just the stack.
|
||||
int RawSerial::printf(const char *format, ...) {
|
||||
std::va_list arg;
|
||||
va_start(arg, format);
|
||||
int len = vsnprintf(NULL, 0, format, arg);
|
||||
if (len < STRING_STACK_LIMIT) {
|
||||
char temp[STRING_STACK_LIMIT];
|
||||
vsprintf(temp, format, arg);
|
||||
puts(temp);
|
||||
} else {
|
||||
char *temp = new char[len + 1];
|
||||
vsprintf(temp, format, arg);
|
||||
puts(temp);
|
||||
delete[] temp;
|
||||
}
|
||||
va_end(arg);
|
||||
return len;
|
||||
}
|
||||
|
||||
} // namespace mbed
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue