modify to nucleo stm32F411
Dependencies: RingBuffer
Dependents: MX_control Program_BEAR_Protocol SwitchMode BEAR_Motion ... more
Fork of iSerial by
Diff: SerialIntr.cpp
- Revision:
- 0:1d193cb1a933
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SerialIntr.cpp Fri Aug 31 17:17:12 2012 +0000 @@ -0,0 +1,150 @@ +// +// SerialIntr.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 "SerialIntr.h" + + +//DigitalOut led1(LED1); +//DigitalOut led2(LED2); +//DigitalOut led3(LED3); +//DigitalOut led4(LED4); + +/* + * Interrupt Function + */ +void +SerialIntr::rx_handler(void) +{ +// led4 = !led4; + + if(Serial::readable()){ +// led1 = !led1; + rxbuf.save(Serial::getc()); +// led2 = !led2; + + } + + NVIC_EnableIRQ(UART_IRQn); // UART1_IRQn); +} + +void +SerialIntr::tx_handler(void) +{ +// led3 = !led3; + + if(writeable()){ + if(txbuf.check()){ + Serial::putc( txbuf.read() ); + } + } + NVIC_EnableIRQ(UART_IRQn); // UART1_IRQn); +} + +/* + * void sci_init(void) + * + * ポート初期化関数....すべてのI/Oの設定を行っている. + * + * 引数:なし + * 戻り値:なし + * + */ +SerialIntr::SerialIntr(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, &SerialIntr::tx_handler, Serial::TxIrq); + attach(this, &SerialIntr::rx_handler, Serial::RxIrq); + +// format(8,Serial::None,1); // default +// baud(baudrate); + + __enable_irq(); + NVIC_EnableIRQ(UART_IRQn); // UART1_IRQn); +} + +/* + * シリアル入力に文字があるかどうかチェック + * 返値: バッファにある文字数 + */ +int +SerialIntr::readable(void) +{ + return rxbuf.check(); +} + +/* + * シリアルから一文字入力 + * --- 文字入力を待つ + */ +int +SerialIntr::getc(void) +{ + unsigned short int c; + + while(!rxbuf.check()); + c = rxbuf.read(); + + return c; +} + + +/* + * シリアルへ一文字出力 + */ +void +SerialIntr::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 +SerialIntr::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 +SerialIntr::puts(const char* s) +{ + short int n = putstr(s); + putc(CR); + putc(LF); + return n; +} +