Nucleo ボードの USB コネクタに対応するシリアルポート受送信割込みで,複数のキャラクタ受送信をサポ-トするクラス. このライブラリを登録した際のプログラム: Demo_F446_AD_DA_Ctrl.
Dependents: F446_FunctionGenerator F446_UpSampling_GraphicEqualizer F446_UpSampling_ReverbSystem F446_UpSampling_FrqShifter_Weaver ... more
Revision 13:deeef404ff49, committed 2020-02-05
- Comitter:
- MikamiUitOpen
- Date:
- Wed Feb 05 08:45:08 2020 +0000
- Parent:
- 12:8cd3385cdee6
- Child:
- 14:268977533f95
- Commit message:
- 14
Changed in this revision
--- 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&); }; }