Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: withbufferserial_nrftst fly_v1
Fork of BufferedSerial by
Diff: BufferedSerial.cpp
- Revision:
- 2:7e8a450a9101
- Parent:
- 1:57a11fb5d529
- Child:
- 3:6b76fcf27545
--- a/BufferedSerial.cpp Thu May 23 23:47:04 2013 +0000
+++ b/BufferedSerial.cpp Fri May 24 22:00:26 2013 +0000
@@ -66,15 +66,16 @@
int BufferedSerial::puts(const char *s)
{
- const char *size = s;
+ const char* ptr = s;
- while(*(s) != 0)
+ while(*(ptr) != 0)
{
- _txbuf = *(s++);
+ _txbuf = *(ptr++);
}
+ _txbuf = '\n'; // done per puts definition
BufferedSerial::prime();
- return s - size;
+ return (ptr - s) + 1;
}
int BufferedSerial::printf(const char* format, ...)
@@ -88,18 +89,33 @@
// this may not hit the heap but should alert the user anyways
if(r > sizeof(buf))
{
- ERROR("Buffer Overwrite Occured!\n");
+ ERROR("Buffer Overflow on the Stack Occured!\n");
}
- r = BufferedSerial::puts(buf);
+ r = BufferedSerial::write(buf, r);
va_end(arg);
return r;
}
+ssize_t BufferedSerial::write(const void *s, size_t length)
+{
+ const char* ptr = (const char*)s;
+ const char* end = ptr + length;
+
+ while (ptr != end)
+ {
+ _txbuf = *(ptr++);
+ }
+ BufferedSerial::prime();
+
+ return ptr - (const char*)s;
+}
+
+
void BufferedSerial::rxIrq(void)
{
// read from the peripheral and see if things are available
- while(serial_readable(&_serial))
+ if(serial_readable(&_serial))
{
_rxbuf = serial_getc(&_serial); // if so load them into a buffer
}
@@ -110,7 +126,7 @@
void BufferedSerial::txIrq(void)
{
// see if there is room in the hardware buffer and something is in the software buffer
- while(serial_writable(&_serial) && _txbuf.available())
+ if(serial_writable(&_serial) && _txbuf.available())
{
serial_putc(&_serial, (int)_txbuf.get());
}
@@ -120,12 +136,15 @@
void BufferedSerial::prime(void)
{
- __disable_irq(); // make sure not to cause contention in the irq
- BufferedSerial::txIrq(); // prime the txirq to stoke transmit
- __enable_irq();
+ // if already busy then the irq will pick this up
+ if(serial_writable(&_serial))
+ {
+ __disable_irq(); // make sure not to cause contention in the irq
+ BufferedSerial::txIrq(); // prime the txirq - only write to hardware in one place
+ __enable_irq();
+ }
return;
}
-
