5555+
Dependencies: RingBuffer
Fork of iSerial by
SerialIntr.cpp
- Committer:
- ykuroda
- Date:
- 2012-08-31
- Revision:
- 0:1d193cb1a933
File content as of revision 0:1d193cb1a933:
// // 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; }