Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: Dumb_box_rev2 mbed_GPSproject
iSerial.cpp@2:3fc74f4d685a, 2012-08-31 (annotated)
- 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?
| User | Revision | Line number | New 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 |