Infrared SoftSerial. Use CircularBuffer.
Dependents: Test_SoftSerial_Infrared
Revision 11:f186cc69acdf, committed 2020-05-10
- Comitter:
- kenjiArai
- Date:
- Sun May 10 08:10:29 2020 +0000
- Parent:
- 10:671a6724ce79
- Child:
- 12:7ab9ab7210e7
- Commit message:
- Change Callback method
Changed in this revision
--- a/Buffer.lib Sat Jul 05 13:23:03 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -https://mbed.org/users/sam_grove/code/Buffer/#cd0a1f4c623f
--- a/BufferedSoftSerial.cpp Sat Jul 05 13:23:03 2014 +0000 +++ b/BufferedSoftSerial.cpp Sun May 10 08:10:29 2020 +0000 @@ -1,6 +1,7 @@ /** * @file BufferedSoftSerial.cpp - * @brief Software Buffer - Extends mbed Serial functionallity adding irq driven TX and RX + * @brief Software Buffer + * - Extends mbed Serial functionallity adding irq driven TX and RX * @author sam grove * @version 1.0 * @see @@ -20,37 +21,44 @@ * limitations under the License. */ +// Modified by K.Arai / JH1PJL May 10th, 2020 + #include "BufferedSoftSerial.h" #include <stdarg.h> BufferedSoftSerial::BufferedSoftSerial(PinName tx, PinName rx, const char* name) : SoftSerial(tx, rx, name) { - SoftSerial::attach(this, &BufferedSoftSerial::rxIrq, SoftSerial::RxIrq); - + _rxbuf.reset(); + _txbuf.reset(); + SoftSerial::attach(this, &BufferedSoftSerial::rx_Irq, SoftSerial::RxIrq); return; } int BufferedSoftSerial::readable(void) { - return _rxbuf.available(); // note: look if things are in the buffer + return !_rxbuf.empty(); } int BufferedSoftSerial::writeable(void) { - return 1; // buffer allows overwriting by design, always true + return _txbuf.full(); } int BufferedSoftSerial::getc(void) { - return _rxbuf; + char c; + while(_rxbuf.empty()) { + ; + } + _rxbuf.pop(c); + return c; } int BufferedSoftSerial::putc(int c) { - _txbuf = (char)c; - BufferedSoftSerial::prime(); - + _txbuf.push((char)c); + prime(); return c; } @@ -59,11 +67,12 @@ const char* ptr = s; while(*(ptr) != 0) { - _txbuf = *(ptr++); + _txbuf.push(*(ptr++)); } - _txbuf = '\n'; // done per puts definition - BufferedSoftSerial::prime(); - +#if 0 + _txbuf.push('\n'); // done per puts definition +#endif + prime(); return (ptr - s) + 1; } @@ -80,8 +89,7 @@ error("%s %d buffer overwrite!\n", __FILE__, __LINE__); } va_end(arg); - r = BufferedSoftSerial::write(buf, r); - + r = write(buf, r); return r; } @@ -91,37 +99,37 @@ const char* end = ptr + length; while (ptr != end) { - _txbuf = *(ptr++); + _txbuf.push(*(ptr++)); } - BufferedSoftSerial::prime(); - + prime(); return ptr - (const char*)s; } -void BufferedSoftSerial::rxIrq(void) +void BufferedSoftSerial::rx_Irq(void) { // read from the peripheral and make sure something is available if(SoftSerial::readable()) { - _rxbuf = _getc(); // if so load them into a buffer + _rxbuf.push(_getc()); // if so load them into a buffer } - return; } -void BufferedSoftSerial::txIrq(void) +void BufferedSoftSerial::tx_Irq(void) { - // see if there is room in the hardware fifo and if something is in the software fifo + // see if there is room in the hardware fifo and + // if something is in the software fifo while(SoftSerial::writeable()) { - if(_txbuf.available()) { - _putc((int)_txbuf.get()); + if(!_txbuf.empty()) { + char c; + _txbuf.pop(c); + _putc((int)c); } else { // disable the TX interrupt when there is nothing left to send SoftSerial::attach(NULL, SoftSerial::TxIrq); break; } } - return; } @@ -129,12 +137,11 @@ { // if already busy then the irq will pick this up if(SoftSerial::writeable()) { - SoftSerial::attach(NULL, SoftSerial::TxIrq); // make sure not to cause contention in the irq - BufferedSoftSerial::txIrq(); // only write to hardware in one place - SoftSerial::attach(this, &BufferedSoftSerial::txIrq, SoftSerial::TxIrq); + // make sure not to cause contention in the irq + SoftSerial::attach(NULL, SoftSerial::TxIrq); + // only write to hardware in one place + tx_Irq(); + SoftSerial::attach(this,&BufferedSoftSerial::tx_Irq,SoftSerial::TxIrq); } - return; } - -
--- a/BufferedSoftSerial.h Sat Jul 05 13:23:03 2014 +0000 +++ b/BufferedSoftSerial.h Sun May 10 08:10:29 2020 +0000 @@ -1,10 +1,11 @@ /** * @file BufferedSoftSerial.h - * @brief Software Buffer - Extends mbed Serial functionallity adding irq driven TX and RX + * @brief Software Buffer + * - Extends mbed Serial functionallity adding irq driven TX and RX * @author sam grove * @version 1.0 - * @see + * @see * * Copyright (c) 2013 * @@ -21,11 +22,20 @@ * limitations under the License. */ +/* + Original Library by Erik- + https://os.mbed.com/users/Sissors/code/BufferedSoftSerial/ + + Modified by K.Arai / JH1PJL May 9th, 2020 + + modified parts + use CircularBuffer (mbed standard library) + */ + #ifndef BUFFEREDSOFTSERIAL_H #define BUFFEREDSOFTSERIAL_H - + #include "mbed.h" -#include "Buffer.h" #include "SoftSerial.h" /** A serial port (UART) for communication with other serial devices @@ -37,33 +47,34 @@ * however if you don't have spare ones, you can use this. It is advicable * to put the serial connection with highest speed to hardware serial. * - * If you lack RAM memory you can also use SoftSerial without this buffer around it. + * If you lack RAM memory you can also use SoftSerial + * without this buffer around it. * In that case it is fully blocking. * * Example: * @code * #include "mbed.h" * #include "BufferedSoftSerial.h" - * + * * SoftSerial block(USBTX, USBRX); -* BufferedSoftSerial buf(USBTX, USBRX); - * + * BufferedSoftSerial buf(D3, D2); + * * int main() * { * while(1) { * Timer s; - * + * * s.start(); * buf.printf("Hello World - buffered\r\n"); * int buffered_time = s.read_us(); * wait(0.1f); // give time for the buffer to empty - * + * * s.reset(); * block.printf("Hello World - blocking\r\n"); * int polled_time = s.read_us(); * s.stop(); * wait(0.1f); // give time for the buffer to empty - * + * * buf.printf("printf buffered took %d us\r\n", buffered_time); * buf.printf("printf blocking took %d us\r\n", polled_time); * wait(5); @@ -75,59 +86,62 @@ /** * @class BufferedSerial * @brief Software buffers and interrupt driven tx and rx for SoftSerial - */ -class BufferedSoftSerial : public SoftSerial + */ +class BufferedSoftSerial : public SoftSerial { private: - Buffer <char> _rxbuf; - Buffer <char> _txbuf; - - void rxIrq(void); - void txIrq(void); + CircularBuffer<char, 1024> _rxbuf; + CircularBuffer<char, 1024> _txbuf; + + void rx_Irq(void); + void tx_Irq(void); void prime(void); - + public: - /** Create a BufferedSoftSerial port, connected to the specified transmit and receive pins + /** Create a BufferedSoftSerial port, + * connected to the specified transmit and receive pins * @param tx Transmit pin * @param rx Receive pin * @note Either tx or rx may be specified as NC if unused */ BufferedSoftSerial(PinName tx, PinName rx, const char* name=NULL); - + /** Check on how many bytes are in the rx buffer * @return 1 if something exists, 0 otherwise */ virtual int readable(void); - + /** Check to see if the tx buffer has room - * @return 1 always has room and can overwrite previous content if too small / slow + * @return 1 always has room and can overwrite previous content + * if too small / slow */ virtual int writeable(void); - + /** Get a single byte from the BufferedSoftSerial Port. * Should check readable() before calling this. * @return A byte that came in on the BufferedSoftSerial Port */ virtual int getc(void); - + /** Write a single byte to the BufferedSoftSerial Port. * @param c The byte to write to the BufferedSoftSerial Port * @return The byte that was written to the BufferedSoftSerial Port Buffer */ virtual int putc(int c); - + /** Write a string to the BufferedSoftSerial Port. Must be NULL terminated * @param s The string to write to the Serial Port * @return The number of bytes written to the Serial Port Buffer */ virtual int puts(const char *s); - + /** Write a formatted string to the BufferedSoftSerial Port. - * @param format The string + format specifiers to write to the BufferedSoftSerial Port + * @param format The string + format specifiers to write + * to the BufferedSoftSerial Port * @return The number of bytes written to the Serial Port Buffer */ virtual int printf(const char* format, ...); - + /** Write data to the BufferedSoftSerial Port * @param s A pointer to data to send * @param length The amount of data being pointed to
--- a/SoftSerial.lib Sat Jul 05 13:23:03 2014 +0000 +++ b/SoftSerial.lib Sun May 10 08:10:29 2020 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/Sissors/code/SoftSerial/#236fce2e5b8c +https://os.mbed.com/users/kenjiArai/code/SoftSerial/#cd58d03b8559