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

Dependents:   F446_FunctionGenerator F446_UpSampling_GraphicEqualizer F446_UpSampling_ReverbSystem F446_UpSampling_FrqShifter_Weaver ... more

Files at this revision

API Documentation at this revision

Comitter:
MikamiUitOpen
Date:
Wed Feb 05 08:45:08 2020 +0000
Parent:
12:8cd3385cdee6
Child:
14:268977533f95
Commit message:
14

Changed in this revision

SerialRxTxIntr.cpp Show annotated file Show diff for this revision Revisions of this file
SerialRxTxIntr.hpp Show annotated file Show diff for this revision Revisions of this file
SerialTxIntr.cpp Show annotated file Show diff for this revision Revisions of this file
SerialTxIntr.hpp Show annotated file Show diff for this revision Revisions of this file
--- a/SerialRxTxIntr.cpp	Mon Jan 27 07:43:38 2020 +0000
+++ b/SerialRxTxIntr.cpp	Wed Feb 05 08:45:08 2020 +0000
@@ -2,53 +2,53 @@
 //  Nucleo ボードの USB コネクタに対応するシリアルポート受送信割込みで
 //  複数のキャラクタ受送信をサポ-トするクラス
 //
-//  2019/11/23, Copyright (c) 2018 MIKAMI, Naoki
+//  2020/02/05, Copyright (c) 2020 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));
-	}
+    // コンストラクタ
+    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;
+    // メッセージの終了であればそのメッセージを保存し true を返す
+    bool SerialRxTxIntr::IsEol()
+    {
+        if (!eol_) return false;
 
-    	eol_ = false;
-	    buffer2_ = rxBuffer_;   // メッセージの保存
-    	rxBuffer_ = "";         // 受信バッファをクリア
-	    return true;
-	}
+        eol_ = false;
+        buffer2_ = rxBuffer_;   // メッセージの保存
+        rxBuffer_ = "";         // 受信バッファをクリア
+        return true;
+    }
 
-	// シリアル・ポートの受信割り込みに対する割り込みサービス・ルーチン
-	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;
+    // シリアル・ポートの受信割り込みに対する割り込みサービス・ルーチン
+    void SerialRxTxIntr::RxIsr()
+    {
+        unsigned char chr = pc_.getc();
+        if (echoOn_)            // エコーバックが有効な場合
+        {
+            tx_.TxChar(chr);    // エコーバック
+            if (chr == '\r') tx_.TxChar('\n');
+        }
+        // "\r" を受信した場合はメッセージの終了とする
+        // "\r" は rxBuffer_ に追加されない
+        if (chr == '\r') eol_ = true;
+        else             rxBuffer_ += chr;
 
-    	// 受信するメッセージの文字数のチェック
-	    if (rxBuffer_.size() > RX_MAX_)
-	    {
-		    char ch[32];
-		    sprintf(ch, "Exceeded %d characters", RX_MAX_);
-		    mbed_assert_internal(ch, __FILE__, __LINE__);
-		}
-	}
+        // 受信するメッセージの文字数のチェック
+        if (rxBuffer_.size() > RX_MAX_)
+        {
+            char ch[32];
+            sprintf(ch, "Exceeded %d characters", RX_MAX_);
+            mbed_assert_internal(ch, __FILE__, __LINE__);
+        }
+    }
 }
\ No newline at end of file
--- a/SerialRxTxIntr.hpp	Mon Jan 27 07:43:38 2020 +0000
+++ b/SerialRxTxIntr.hpp	Wed Feb 05 08:45:08 2020 +0000
@@ -9,7 +9,7 @@
 //  Nucleo-F446RE の場合,ファームウェアの更新をしなくても
 //  115,200 boud までは動作可能
 //
-//  2019/01/26, Copyright (c) 2019 MIKAMI, Naoki
+//  2020/02/05, Copyright (c) 2020 MIKAMI, Naoki
 //-------------------------------------------------------------
 
 #include "mbed.h"
@@ -24,18 +24,12 @@
     class SerialRxTxIntr
     {
     public:
-        SerialRxTxIntr(int maxChar = 32, int baud = 9600);
-
-        // メッセージの終了であればそのメッセージを保存し true を返す
-        bool IsEol();
-        // バッファの内容を取得
-        string GetBuffer() { return buffer2_; }
-        // エコーバック ON
-        void EchobackEnable() { echoOn_ = true; }
-        // エコーバック OFF
-        void EchobackDisable() { echoOn_ = false; }
-        // 文字列の送信
-        void Tx(string str) { tx_.TxString(str); }
+        SerialRxTxIntr(int maxChar = 32, int baud = 9600);  // コンストラクタ
+        bool IsEol();   // メッセージの終了であればそのメッセージを保存し true を返す
+        string GetBuffer() { return buffer2_; }             // バッファの内容を取得
+        void EchobackEnable() { echoOn_ = true; }           // エコーバック ON
+        void EchobackDisable() { echoOn_ = false; }         // エコーバック OFF
+        void TxString(string str) { tx_.TxString(str); }    // 文字列の送信
 
     private:
         Serial pc_;
@@ -50,9 +44,8 @@
         // シリアル・ポートの受信割り込みに対する割り込みサービス・ルーチン
         void RxIsr();
 
-        // コピー・コンストラクタの禁止のため
+        // コピー・コンストラクタ,代入演算子の禁止のため
         SerialRxTxIntr(const SerialRxTxIntr&);
-        // 代入演算子の禁止のため
         SerialRxTxIntr& operator=(const SerialRxTxIntr&);
     };
 }
--- a/SerialTxIntr.cpp	Mon Jan 27 07:43:38 2020 +0000
+++ b/SerialTxIntr.cpp	Wed Feb 05 08:45:08 2020 +0000
@@ -2,50 +2,48 @@
 //  Nucleo ボードの USB コネクタに対応するシリアルポート送信割込みで
 //  キャラクタの送信をサポ-トするクラス
 //
-//  ボーレートのデフォルト値は 9,600 boud
-//
-//  2020/01/27, Copyright (c) 2020 MIKAMI, Naoki
+//  2020/02/05, Copyright (c) 2020 MIKAMI, Naoki
 //-------------------------------------------------------------
 
 #include "SerialTxIntr.hpp"
 
 namespace Mikami
 {
-	// コンストラクタ
-	SerialTxIntr::SerialTxIntr(Serial &tx) : tx_(tx), USART_(USART2)
-	{
-    	tx_.attach(callback(this, &SerialTxIntr::TxIsr), Serial::TxIrq);
-	}
+    // コンストラクタ
+    SerialTxIntr::SerialTxIntr(Serial &tx) : tx_(tx), USART_(USART2)
+    {
+        tx_.attach(callback(this, &SerialTxIntr::TxIsr), Serial::TxIrq);
+    }
     
-	// 送信データ書き込み
-	void SerialTxIntr::TxWrite(char c)
-	{
-    	USART_->CR1 &= ~USART_CR1_TXEIE;    // 送信割込み禁止
-	    // 送信レジスタ (DR) が空でかつ送信バッファが空かどうか調べる
-    	if ( que_.empty() &&    // 両者が空の場合
-        	 ((USART_->SR && USART_SR_TXE_Msk) == USART_SR_TXE) )    
-	        Write(c);                 		// 送信レジスタにデータを書き込む
-    	else                                // 少なくとも一方が空ではない場合
-        	que_.push(c);                   // 送信バッファにデータを格納
-	    USART_->CR1 |= USART_CR1_TXEIE;     // 送信割込み許可
-	}
+    // 1文字の送信
+    void SerialTxIntr::TxChar(char c)
+    {
+        DisableTxIntr();                    // 送信割込み禁止
 
-	// 文字列の送信
+        // 送信レジスタ (TDR) が空でかつ送信バッファが空かどうか調べる
+        if ( que_.empty() && IsTdrEmpty() ) // 両者が空の場合
+            WriteTDR(c);                    // 送信レジスタにデータを書き込む
+        else                                // 少なくとも一方が空ではない場合
+            que_.push(c);                   // 送信バッファにデータを格納
+
+        EnableTxIntr();                     // 送信割込み許可
+    }
+
+    // 文字列の送信
     void SerialTxIntr::TxString(string str)
     {
-    	for (int n=0; n<str.size(); n++)
-    		TxWrite(str[n]);
+        for (int n=0; n<str.size(); n++) TxChar(str[n]);
     }
     
-	// シリアルポート送信割込みサービスルーチン
-	void SerialTxIntr::TxIsr()
-	{
-	    if (!que_.empty())
-    	{
-        	Write(que_.front());	// 送信用バッファから取り出したデータを送信レジスタへ書き込む
-	        que_.pop();             // 先頭のデータを消去
-    	}
-	    else
-    	    USART_->CR1 &= ~USART_CR1_TXEIE;    // 送信割込み禁止
-	}
+    // シリアルポート送信割込みサービスルーチン
+    void SerialTxIntr::TxIsr()
+    {
+        if (!que_.empty())
+        {
+            WriteTDR(que_.front()); // 送信用バッファから取り出したデータを TDR へ書き込む
+            que_.pop();             // 先頭のデータを消去
+        }
+        else
+            DisableTxIntr();        // 送信割込み禁止
+    }
 }
\ No newline at end of file
--- a/SerialTxIntr.hpp	Mon Jan 27 07:43:38 2020 +0000
+++ b/SerialTxIntr.hpp	Wed Feb 05 08:45:08 2020 +0000
@@ -2,9 +2,7 @@
 //  Nucleo ボードの USB コネクタに対応するシリアルポート送信割込みで
 //  キャラクタの送信をサポ-トするクラス
 //
-//  ボーレートのデフォルト値は 9,600 boud
-//
-//  2020/01/27, Copyright (c) 2020 MIKAMI, Naoki
+//  2020/02/05, Copyright (c) 2020 MIKAMI, Naoki
 //-------------------------------------------------------------
 
 #include "mbed.h"
@@ -20,7 +18,7 @@
     {
     public:
         explicit SerialTxIntr(Serial &tx);  // コンストラクタ
-        void TxWrite(char c);       // 送信データ書き込み
+        void TxChar(char c);        // 1文字の送信
         void TxString(string str);  // 文字列の送信
 
     private:
@@ -28,12 +26,20 @@
         queue<char> que_;           // FIFO による送信用バッファ
         USART_TypeDef* const USART_;
 
-        void TxIsr();               // シリアルポート送信割込みサービスルーチン
-        void Write(char ch) { USART_->DR = ch; }
+        // TDR へ書込み
+        void WriteTDR(char ch) { USART_->DR = ch; }
+        // 送信割込み許可
+        void EnableTxIntr() { USART_->CR1 |= USART_CR1_TXEIE; }
+        // 送信割込み禁止
+        void DisableTxIntr() { USART_->CR1 &= ~USART_CR1_TXEIE; }
+        // TDR が空の場合に true を返す
+        bool IsTdrEmpty()
+        { return (USART_->SR && USART_SR_TXE_Msk) == USART_SR_TXE; }
 
-        // コピー・コンストラクタの禁止のため
+        void TxIsr();   // シリアルポート送信割込みサービスルーチン
+
+        // コピー・コンストラクタ,代入演算子の禁止のため
         SerialTxIntr(const SerialTxIntr&);
-        // 代入演算子の禁止のため
         SerialTxIntr& operator=(const SerialTxIntr&);
     };
 }