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-09-28
Revision:
6:8084247806a4
Parent:
5:151d281afa55
Child:
7:190d94fba10d

File content as of revision 6:8084247806a4:

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

#include "SerialRxTxIntr.hpp"

namespace Mikami
{
	// コンストラクタ
	SerialRxTxIntr::SerialRxTxIntr(int maxChar, int baud)
    	: pc_(USBTX, USBRX, baud), tx_(pc_), RX_MAX_(maxChar),
	      eol_(false), rxBuffer_(""), buffer2_(""), echoOn_(false)
	{
    	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)
	{
		tx_.TxString(str);
	    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() > RX_MAX_)
    	{
	        // 文字数オーバーの処理,ボードの LED を高速に点滅する
    	    DigitalOut myLed(LED1);
        	while (true)
	        {
    	        myLed = !myLed;
        	    wait_ms(50);
	        }
    	}
	}
}