5555+

Dependencies:   RingBuffer

Fork of iSerial by BE@R lab

Committer:
ykuroda
Date:
Fri Aug 31 17:17:12 2012 +0000
Revision:
0:1d193cb1a933
1st coding

Who changed what in which revision?

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