5555+

Dependencies:   RingBuffer

Fork of iSerial by BE@R lab

Committer:
ykuroda
Date:
Fri Aug 31 17:32:00 2012 +0000
Revision:
2:3fc74f4d685a
Parent:
SerialIntr.cpp@0:1d193cb1a933
Child:
3:d5353b68105f
Name change

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ykuroda 0:1d193cb1a933 1 //
ykuroda 2:3fc74f4d685a 2 // iSerial.cpp ... Serial Driver with Interrupt Rec/Send
ykuroda 0:1d193cb1a933 3 //
ykuroda 0:1d193cb1a933 4 // 2009.11.13 ... Originally written by Y.Kuroda for Renesas H83664
ykuroda 0:1d193cb1a933 5 // 2012.08.31 ... Code convert for mbed in C++
ykuroda 0:1d193cb1a933 6 //
ykuroda 0:1d193cb1a933 7 #include "mbed.h"
ykuroda 0:1d193cb1a933 8 #include "RingBuffer.h"
ykuroda 2:3fc74f4d685a 9 #include "iSerial.h"
ykuroda 0:1d193cb1a933 10
ykuroda 0:1d193cb1a933 11
ykuroda 0:1d193cb1a933 12 /*
ykuroda 0:1d193cb1a933 13 * Interrupt Function
ykuroda 0:1d193cb1a933 14 */
ykuroda 0:1d193cb1a933 15 void
ykuroda 2:3fc74f4d685a 16 ISerial::rx_handler(void)
ykuroda 0:1d193cb1a933 17 {
ykuroda 0:1d193cb1a933 18 if(Serial::readable()){
ykuroda 0:1d193cb1a933 19 rxbuf.save(Serial::getc());
ykuroda 0:1d193cb1a933 20 }
ykuroda 2:3fc74f4d685a 21
ykuroda 0:1d193cb1a933 22 NVIC_EnableIRQ(UART_IRQn); // UART1_IRQn);
ykuroda 0:1d193cb1a933 23 }
ykuroda 0:1d193cb1a933 24
ykuroda 0:1d193cb1a933 25 void
ykuroda 2:3fc74f4d685a 26 ISerial::tx_handler(void)
ykuroda 0:1d193cb1a933 27 {
ykuroda 2:3fc74f4d685a 28 if(Serial::writeable()){
ykuroda 0:1d193cb1a933 29 if(txbuf.check()){
ykuroda 0:1d193cb1a933 30 Serial::putc( txbuf.read() );
ykuroda 0:1d193cb1a933 31 }
ykuroda 0:1d193cb1a933 32 }
ykuroda 0:1d193cb1a933 33 NVIC_EnableIRQ(UART_IRQn); // UART1_IRQn);
ykuroda 0:1d193cb1a933 34 }
ykuroda 0:1d193cb1a933 35
ykuroda 0:1d193cb1a933 36 /*
ykuroda 0:1d193cb1a933 37 * void sci_init(void)
ykuroda 0:1d193cb1a933 38 *
ykuroda 0:1d193cb1a933 39 * ポート初期化関数....すべてのI/Oの設定を行っている.
ykuroda 0:1d193cb1a933 40 *
ykuroda 0:1d193cb1a933 41 *  引数:なし
ykuroda 0:1d193cb1a933 42 *  戻り値:なし
ykuroda 0:1d193cb1a933 43 *
ykuroda 0:1d193cb1a933 44 */
ykuroda 2:3fc74f4d685a 45 ISerial::ISerial(PinName _tx, PinName _rx, const char *_name, int _txbufsize, int _rxbufsize)
ykuroda 0:1d193cb1a933 46 : Serial(_tx, _rx, _name),
ykuroda 0:1d193cb1a933 47 txbuf(RingBuffer(_txbufsize)),
ykuroda 0:1d193cb1a933 48 rxbuf(RingBuffer(_rxbufsize))
ykuroda 0:1d193cb1a933 49 {
ykuroda 0:1d193cb1a933 50 __disable_irq();
ykuroda 0:1d193cb1a933 51
ykuroda 2:3fc74f4d685a 52 attach(this, &ISerial::tx_handler, Serial::TxIrq);
ykuroda 2:3fc74f4d685a 53 attach(this, &ISerial::rx_handler, Serial::RxIrq);
ykuroda 0:1d193cb1a933 54
ykuroda 0:1d193cb1a933 55 // format(8,Serial::None,1); // default
ykuroda 0:1d193cb1a933 56 // baud(baudrate);
ykuroda 0:1d193cb1a933 57
ykuroda 0:1d193cb1a933 58 __enable_irq();
ykuroda 0:1d193cb1a933 59 NVIC_EnableIRQ(UART_IRQn); // UART1_IRQn);
ykuroda 0:1d193cb1a933 60 }
ykuroda 0:1d193cb1a933 61
ykuroda 0:1d193cb1a933 62 /*
ykuroda 0:1d193cb1a933 63 * シリアル入力に文字があるかどうかチェック
ykuroda 0:1d193cb1a933 64 * 返値: バッファにある文字数
ykuroda 0:1d193cb1a933 65 */
ykuroda 0:1d193cb1a933 66 int
ykuroda 2:3fc74f4d685a 67 ISerial::readable(void)
ykuroda 0:1d193cb1a933 68 {
ykuroda 0:1d193cb1a933 69 return rxbuf.check();
ykuroda 0:1d193cb1a933 70 }
ykuroda 0:1d193cb1a933 71
ykuroda 0:1d193cb1a933 72 /*
ykuroda 0:1d193cb1a933 73 * シリアルから一文字入力
ykuroda 0:1d193cb1a933 74 * --- 文字入力を待つ
ykuroda 0:1d193cb1a933 75 */
ykuroda 0:1d193cb1a933 76 int
ykuroda 2:3fc74f4d685a 77 ISerial::getc(void)
ykuroda 0:1d193cb1a933 78 {
ykuroda 0:1d193cb1a933 79 unsigned short int c;
ykuroda 0:1d193cb1a933 80
ykuroda 0:1d193cb1a933 81 while(!rxbuf.check());
ykuroda 0:1d193cb1a933 82 c = rxbuf.read();
ykuroda 0:1d193cb1a933 83
ykuroda 0:1d193cb1a933 84 return c;
ykuroda 0:1d193cb1a933 85 }
ykuroda 0:1d193cb1a933 86
ykuroda 0:1d193cb1a933 87
ykuroda 0:1d193cb1a933 88 /*
ykuroda 0:1d193cb1a933 89 * シリアルへ一文字出力
ykuroda 0:1d193cb1a933 90 */
ykuroda 0:1d193cb1a933 91 void
ykuroda 2:3fc74f4d685a 92 ISerial::putc(short ch)
ykuroda 0:1d193cb1a933 93 {
ykuroda 0:1d193cb1a933 94 if(txbuf.check()==0 && Serial::writeable()){
ykuroda 0:1d193cb1a933 95 Serial::putc(ch);
ykuroda 0:1d193cb1a933 96
ykuroda 0:1d193cb1a933 97 } else {
ykuroda 0:1d193cb1a933 98 while(txbuf.full());
ykuroda 0:1d193cb1a933 99 txbuf.save(ch);
ykuroda 0:1d193cb1a933 100 NVIC_EnableIRQ(UART_IRQn); // UART1_IRQn);
ykuroda 0:1d193cb1a933 101 }
ykuroda 0:1d193cb1a933 102 }
ykuroda 0:1d193cb1a933 103
ykuroda 0:1d193cb1a933 104 /*
ykuroda 0:1d193cb1a933 105 * シリアルへ文字列を出力
ykuroda 0:1d193cb1a933 106 *  注:一回の最大文字数はLINESIZE
ykuroda 0:1d193cb1a933 107 *  注:文字列の終わりにはヌル文字が必要.
ykuroda 0:1d193cb1a933 108 *
ykuroda 0:1d193cb1a933 109 *  引数:文字列へのポインタ
ykuroda 0:1d193cb1a933 110 *  返値:出力した文字数
ykuroda 0:1d193cb1a933 111 */
ykuroda 0:1d193cb1a933 112 short int
ykuroda 2:3fc74f4d685a 113 ISerial::putstr(const char* s)
ykuroda 0:1d193cb1a933 114 {
ykuroda 0:1d193cb1a933 115 int i=0;
ykuroda 0:1d193cb1a933 116 for(; ; i++){
ykuroda 0:1d193cb1a933 117 if(*s==0) break;
ykuroda 0:1d193cb1a933 118 putc(*s++);
ykuroda 0:1d193cb1a933 119 }
ykuroda 0:1d193cb1a933 120 return i;
ykuroda 0:1d193cb1a933 121 }
ykuroda 0:1d193cb1a933 122
ykuroda 0:1d193cb1a933 123 /* short int sci_puts(char* s)
ykuroda 0:1d193cb1a933 124 * シリアルへ文字列を一行出力
ykuroda 0:1d193cb1a933 125 *  注:最後に改行コードを送る他はsci_putstrと同じ
ykuroda 0:1d193cb1a933 126 *
ykuroda 0:1d193cb1a933 127 *  引数:文字列へのポインタ
ykuroda 0:1d193cb1a933 128 *  返値:出力した文字数
ykuroda 0:1d193cb1a933 129 */
ykuroda 0:1d193cb1a933 130 short int
ykuroda 2:3fc74f4d685a 131 ISerial::puts(const char* s)
ykuroda 0:1d193cb1a933 132 {
ykuroda 0:1d193cb1a933 133 short int n = putstr(s);
ykuroda 0:1d193cb1a933 134 putc(CR);
ykuroda 0:1d193cb1a933 135 putc(LF);
ykuroda 0:1d193cb1a933 136 return n;
ykuroda 0:1d193cb1a933 137 }
ykuroda 0:1d193cb1a933 138