不韋 呂 / SerialTxRxIntr

Dependents:   F446_FunctionGenerator F446_UpSampling_GraphicEqualizer F446_UpSampling_ReverbSystem F446_UpSampling_FrqShifter_Weaver ... more

SerialRxTxIntr.cpp

Committer:
MikamiUitOpen
Date:
2018-09-18
Revision:
4:fb847a82f735
Parent:
3:63d7bf321ba2
Child:
5:151d281afa55

File content as of revision 4:fb847a82f735:

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

#include "SerialRxTxIntr.hpp"

namespace Mikami
{
    // コンストラクタ
    SerialRxTxIntr::SerialRxTxIntr(int maxChar, int baud)
        : pc_(USBTX, USBRX, baud), tx_(pc_), buffer2_(""), echoOn_(false)
    {
        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;
    }

    // 文字列の送信
    //      lf が false の場合は,最後に '\n' を送信しない
    void SerialRxTxIntr::Tx(string str, bool lf)
    {
        for (int n=0; n<str.size(); n++)
            tx_.TxWrite(str[n]);
        if (lf) tx_.TxWrite('\n');
    }

    // シリアル・ポートの受信割り込みに対する割り込みサービス・ルーチン
    void SerialRxTxIntr::RxIsr()
    {
        unsigned char chr = pc_.getc();
        if (echoOn_)    // エコーバックが有効な場合
        {
            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_ = "";
}