Nucleo ボードの USB コネクタに対応するシリアルポート受送信割込みで,複数のキャラクタ受送信をサポ-トするクラス.   このライブラリを登録した際のプログラム: Demo_F446_AD_DA_Ctrl.

Dependents:   F446_FunctionGenerator F446_UpSampling_GraphicEqualizer F446_UpSampling_ReverbSystem F446_UpSampling_FrqShifter_Weaver ... more

SerialRxTxIntr.cpp

Committer:
MikamiUitOpen
Date:
2018-07-09
Revision:
1:09c07078126f
Parent:
0:6b652858f92d
Child:
2:f6e15c19dd75

File content as of revision 1:09c07078126f:

//-------------------------------------------------------------
//  Nucleo ボードの USB コネクタに対応するシリアルポート受送信割込みで
//  複数のキャラクタ受送信をサポ-トするクラス
//
//  2018/07/09, Copyright (c) 2018 MIKAMI, Naoki
//-------------------------------------------------------------

#include "SerialRxTxIntr.hpp"

// コンストラクタ
SerialRxTxIntr::SerialRxTxIntr(int maxChar, int baud)
    : pc_(USBTX, USBRX, baud), tx_(pc_), buffer2_("")
{
    rxMax_ = maxChar;
    pc_.format();    // default: 8 bits, nonparity, 1 stop bit
    pc_.attach(callback(this, &SerialRxTxIntr::RxIsr));
}
    
// メッセージの終了であればそのメッセージを保存し true を返す
bool SerialRxTxIntr::IsEol()
{
    if (!eol_) return false;

    eol_ = false;
    buffer2_ = rxBuffer_;   // メッセージの保存
    rxBuffer_ = "";         // 受信バッファをクリア
    return true;
}

void SerialRxTxIntr::Tx(string str)
{
    for (int n=0; n<str.size(); n++)
        tx_.TxWrite(str[n]);
    tx_.TxWrite('\n');

}

// シリアル・ポートの受信割り込みに対する割り込みサービス・ルーチン
void SerialRxTxIntr::RxIsr()
{
    unsigned char chr = pc_.getc();
    tx_.TxWrite(chr);   // エコー・バック
    if (chr == '\r') tx_.TxWrite('\n');

    // "\r" を受信した場合はメッセージの終了とする
    // "\r" は rxBuffer_ に追加されない
    if (chr == '\r') eol_ = true;
    else             rxBuffer_ += chr;

    // 受信するメッセージの文字数のチェック
    if (rxBuffer_.size() > rxMax_)
    {
        // 文字数オーバーの処理,ボードの LED を高速に点滅する
        DigitalOut myLed(LED1);
        while (true)
        {
            myLed = !myLed;
            wait_ms(50);
        }
    }
}
    
// static メンバの実体の宣言/初期化
int SerialRxTxIntr::rxMax_;
__IO bool SerialRxTxIntr::eol_ = false;
string SerialRxTxIntr::rxBuffer_ = "";