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: Frequency_Counter_w_GPS_1PPS FreqCntr_GPS1PPS_F746F4xx_w_recipro
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;
}
