Better Serial C++ class library with interrupt
Dependents: Dumb_box_rev2 mbed_GPSproject
iSerial class library can easy be used just by swapping Serial declarations.
API
iSerial | |
Examples
#include "mbed.h" #include "iSerial.h" char s[] = "12345678901234567890123456789012345678901234567890"; int main() { iSerial pc(USBTX,USBRX); char* c = s; while(1) { pc.puts(s); while(pc.readable()){ int ret = pc.getc(); if(ret) *c++ = ret; if(c >= s+sizeof(s)-1) c = s; } wait(1); } }
Example 2
Comparing speed of ordinary Serial functions
#include "mbed.h" #include "iSerial.h" char s[] = "12345678901234567890123456789012345678901234567890"; // 50 bytes int main() { Timer t; Serial pc(USBTX,USBRX); pc.baud(921600); t.reset(); t.start(); for(int i=0; i<30; i++) { pc.printf(s); wait(0.001); } t.stop(); int t1 = t.read_us(); pc.puts("\n\n\n"); iSerial ipc(USBTX,USBRX,NULL,1000,100); // try NOT to set the buffer over flowed // iSerial ipc(USBTX,USBRX); // set as default = 100, 100 ipc.baud(921600); t.reset(); t.start(); for(int i=0; i<30; i++) { ipc.printf(s); wait(0.001); } t.stop(); int t2 = t.read_us(); ipc.printf("\n\n\nThe time %d, %d [us] was taken.\n", t1, t2); ipc.puts("End."); ipc.flush(); }
Diff: iSerial.cpp
- Revision:
- 3:d5353b68105f
- Parent:
- 2:3fc74f4d685a
- Child:
- 4:b38ef9675d39
--- a/iSerial.cpp Fri Aug 31 17:32:00 2012 +0000 +++ b/iSerial.cpp Sat Sep 01 12:28:28 2012 +0000 @@ -1,138 +1,138 @@ -// -// iSerial.cpp ... Serial Driver with Interrupt Rec/Send -// -// 2009.11.13 ... Originally written by Y.Kuroda for Renesas H83664 -// 2012.08.31 ... Code convert for mbed in C++ -// -#include "mbed.h" -#include "RingBuffer.h" -#include "iSerial.h" - - -/* - * Interrupt Function - */ -void -ISerial::rx_handler(void) -{ - if(Serial::readable()){ - rxbuf.save(Serial::getc()); - } - - NVIC_EnableIRQ(UART_IRQn); // UART1_IRQn); -} - -void -ISerial::tx_handler(void) -{ - if(Serial::writeable()){ - if(txbuf.check()){ - Serial::putc( txbuf.read() ); - } - } - NVIC_EnableIRQ(UART_IRQn); // UART1_IRQn); -} - -/* - * void sci_init(void) - * - *ããã¼ãåæåé¢æ°ï¼ï¼ï¼ï¼ãã¹ã¦ã®I/Oã®è¨å®ãè¡ã£ã¦ããï¼ - * - *ããå¼æ°ï¼ãªã - *ããæ»ãå¤ï¼ãªã - * - */ -ISerial::ISerial(PinName _tx, PinName _rx, const char *_name, int _txbufsize, int _rxbufsize) -: Serial(_tx, _rx, _name), - txbuf(RingBuffer(_txbufsize)), - rxbuf(RingBuffer(_rxbufsize)) -{ - __disable_irq(); - - attach(this, &ISerial::tx_handler, Serial::TxIrq); - attach(this, &ISerial::rx_handler, Serial::RxIrq); - -// format(8,Serial::None,1); // default -// baud(baudrate); - - __enable_irq(); - NVIC_EnableIRQ(UART_IRQn); // UART1_IRQn); -} - -/* - * ã·ãªã¢ã«å ¥åã«æåããããã©ãããã§ã㯠- * è¿å¤ï¼ ãããã¡ã«ããæåæ° - */ -int -ISerial::readable(void) -{ - return rxbuf.check(); -} - -/* - * ã·ãªã¢ã«ããä¸æåå ¥å - * --- æåå ¥åãå¾ ã¤ - */ -int -ISerial::getc(void) -{ - unsigned short int c; - - while(!rxbuf.check()); - c = rxbuf.read(); - - return c; -} - - -/* - *ãã·ãªã¢ã«ã¸ä¸æååºå - */ -void -ISerial::putc(short ch) -{ - if(txbuf.check()==0 && Serial::writeable()){ - Serial::putc(ch); - - } else { - while(txbuf.full()); - txbuf.save(ch); - NVIC_EnableIRQ(UART_IRQn); // UART1_IRQn); - } -} - -/* - *ãã·ãªã¢ã«ã¸æååãåºå - *ãã注ï¼ä¸åã®æ大æåæ°ã¯LINESIZE - *ãã注ï¼æååã®çµããã«ã¯ãã«æåãå¿ è¦ï¼ - * - *ããå¼æ°ï¼æååã¸ã®ãã¤ã³ã¿ - *ããè¿å¤ï¼åºåããæåæ° - */ -short int -ISerial::putstr(const char* s) -{ - int i=0; - for(; ; i++){ - if(*s==0) break; - putc(*s++); - } - return i; -} - -/*ãshort int sci_puts(char* s) - *ãã·ãªã¢ã«ã¸æååãä¸è¡åºå - *ãã注ï¼æå¾ã«æ¹è¡ã³ã¼ããéãä»ã¯sci_putstrã¨åã - * - *ããå¼æ°ï¼æååã¸ã®ãã¤ã³ã¿ - *ããè¿å¤ï¼åºåããæåæ° - */ -short int -ISerial::puts(const char* s) -{ - short int n = putstr(s); - putc(CR); - putc(LF); - return n; -} - +// +// iSerial.cpp ... Serial Driver with Interrupt Rec/Send +// +// 2009.11.13 ... Originally written by Y.Kuroda for Renesas H83664 +// 2012.08.31 ... Code convert for mbed in C++ +// +#include "mbed.h" +#include "RingBuffer.h" +#include "iSerial.h" + + +/* + * Interrupt Function + */ +void +iSerial::rx_handler(void) +{ + if(Serial::readable()){ + rxbuf.save(Serial::getc()); + } + + NVIC_EnableIRQ(UART_IRQn); // UART1_IRQn); +} + +void +iSerial::tx_handler(void) +{ + if(Serial::writeable()){ + if(txbuf.check()){ + Serial::putc( txbuf.read() ); + } + } + NVIC_EnableIRQ(UART_IRQn); // UART1_IRQn); +} + +/* + * void sci_init(void) + * + *@|[gú»ÖDDDD·×ÄÌI/OÌÝèðsÁÄ¢éD + * + *@@øFȵ + *@@ßèlFȵ + * + */ +iSerial::iSerial(PinName _tx, PinName _rx, const char *_name, int _txbufsize, int _rxbufsize) +: Serial(_tx, _rx, _name), + txbuf(RingBuffer(_txbufsize)), + rxbuf(RingBuffer(_rxbufsize)) +{ + __disable_irq(); + + attach(this, &iSerial::tx_handler, Serial::TxIrq); + attach(this, &iSerial::rx_handler, Serial::RxIrq); + +// format(8,Serial::None,1); // default +// baud(baudrate); + + __enable_irq(); + NVIC_EnableIRQ(UART_IRQn); // UART1_IRQn); +} + +/* + * VAüÍɶª é©Ç¤©`FbN + * ÔlF obt@É é¶ + */ +int +iSerial::readable(void) +{ + return rxbuf.check(); +} + +/* + * VA©çê¶üÍ + * --- ¶üÍðÒ + */ +int +iSerial::getc(void) +{ + unsigned short int c; + + while(!rxbuf.check()); + c = rxbuf.read(); + + return c; +} + + +/* + *@VAÖê¶oÍ + */ +void +iSerial::putc(short ch) +{ + if(txbuf.check()==0 && Serial::writeable()){ + Serial::putc(ch); + + } else { + while(txbuf.full()); + txbuf.save(ch); + NVIC_EnableIRQ(UART_IRQn); // UART1_IRQn); + } +} + +/* + *@VAÖ¶ñðoÍ + *@@FêñÌÅå¶ÍLINESIZE + *@@F¶ñÌIíèÉÍk¶ªKvD + * + *@@øF¶ñÖÌ|C^ + *@@ÔlFo͵½¶ + */ +short int +iSerial::putstr(const char* s) +{ + int i=0; + for(; ; i++){ + if(*s==0) break; + putc(*s++); + } + return i; +} + +/*@short int sci_puts(char* s) + *@VAÖ¶ñðêsoÍ + *@@FÅãÉüsR[hðé¼Ísci_putstrƯ¶ + * + *@@øF¶ñÖÌ|C^ + *@@ÔlFo͵½¶ + */ +short int +iSerial::puts(const char* s) +{ + short int n = putstr(s); + putc(CR); + putc(LF); + return n; +} +