PC から,リアルタイム信号処理を行っている Nucleo-F446 を制御する例.
Dependencies: mbed SerialTxRxIntr F446_AD_DA_Multirate
Diff: main.cpp
- Revision:
- 8:0f3c8d40f2b5
- Parent:
- 7:d69a61923bad
- Child:
- 9:27c118cf75e4
--- a/main.cpp Wed Nov 28 12:40:06 2018 +0000 +++ b/main.cpp Fri Nov 30 12:28:48 2018 +0000 @@ -4,9 +4,9 @@ // メータを変更する例 // // 処理の内容:AD 変換器からの入力に倍率を乗算し DA 変換器に出力する -// 倍率は PC からの指令で変更する -// PC からの指令: 0 ~ 5000(0.0 ~ 1.0 倍) -// 音量調整あり/なしは PC からの指令により ACTIVE/THROUGH の切り替えが可能 +// 倍率は PC からの指令で変更する +// PC からの指令: 0 ~ 5000(0.0 ~ 1.0 倍に対応) +// 音量調整あり/なしは PC からの指令により ACTIVE/THROUGH の切り替えが可能 // // PC 側にデータを送る際のフォーマット // 先頭の1文字で送る内容を区別する @@ -16,9 +16,9 @@ // // PC 側のプログラム // F446_AD_DA_Ctrl -// 端末エミュレータでも使用可能 +// 端末エミュレータでも使用可能(ボーレート:115,200 baud) // -// 2018/11/28, Copyright (c) 2018 MIKAMI, Naoki +// 2018/11/30, Copyright (c) 2018 MIKAMI, Naoki //---------------------------------------------------------------------- #include "F446_Multirate.hpp" @@ -28,17 +28,13 @@ using namespace Mikami; -const int FS_ = 10000; // 入力の標本化周波数: 10 kHz -F446_Multirate myAdDa_; // 出力標本化周波数を4倍にするオブジェクト -SerialRxTxIntr rxTx_; // Serial クラスの受送信割込み用オブジェクト +const int FS_ = 10000; // 入力の標本化周波数: 10 kHz +F446_Multirate myAdDa_; // 出力標本化周波数を4倍にするオブジェクト +SerialRxTxIntr rxTx_(32, 115200); // Serial クラスの受送信割込み用オブジェクト + // ボーレート:38400 baud -// パラメータの値を送信(必要に応じて sprintf() の内容を変えること) -void SendParm(float parm) -{ - char buf[32]; - sprintf(buf, "L音量: %3d %%\n", (int)(parm*100)); - rxTx_.Tx(buf); // label1 に表示する文字列を送信 -} +void SendParm(float param); // パラメータの値を送信 +void Respond(bool &sw, float ¶m); // 受信バッファのデータが有効になった場合の処理 int main() { @@ -64,43 +60,52 @@ myAdDa_.Output(yn); // 出力 //------------------------------------------------------------ - //------------------------------------------------------------ - // PC からの指令に対応する処理 - if (rxTx_.IsEol()) // 受信バッファのデータが有効になった場合の処理 - { - string str = rxTx_.GetBuffer(); - if (str == "ENQ") - { - rxTx_.Tx("ACK\n"); // PC からの "ENQ" に対して "ACK" を送信する - SendParm(volume); // 最初に Label に表示する文字列を送信 - - char buf[16]; - sprintf(buf, "S%5d\n", (uint32_t)(5000*volume)); - rxTx_.Tx(buf); // スライダ(TrackBar)の位置を送信 - - rxTx_.Tx("M入力信号をそのまま出力\n"); - } - else // "ENQ" 以外の処理 - { - if (isalpha(str[0])) // 先頭が A ~ Z, a ~ z の場合 - { - if (str == "ACTIVE") sw = true; - if (str == "THROUGH") sw = false; - } - else // 先頭が A ~ Z, a ~ z 以外の場合 - { - // PC から送信されるデータの範囲: 0 ~ 5000 - // volume の値に変換する,0 <= volume <= 1 - volume = atoi(str.c_str())/5000.0f; - - // PC の Label に表示する文字列を送信 - SendParm(volume); - } - } - } - // PC からの指令に対応する処理はここまで - //------------------------------------------------------------ + Respond(sw, volume); // PC からの指令に対応する処理 } } +// 受信バッファのデータが有効になった場合の処理 +// 必要に応じて param の計算方法を変更すること +void Respond(bool &sw, float ¶m) +{ + if (!rxTx_.IsEol()) return; // 受信バッファのデータが有効ではない場合は処理を行わない + string str = rxTx_.GetBuffer(); + if (str == "ENQ") + { + rxTx_.Tx("ACK\n"); // PC からの "ENQ" に対して "ACK" を送信する + SendParm(param); // 最初に Label に表示する文字列を送信 + + char buf[16]; + sprintf(buf, "S%5d\n", (uint32_t)(5000*param)); + rxTx_.Tx(buf); // 起動時のスライダ(TrackBar)の位置を送信 + + rxTx_.Tx("M入力信号をそのまま出力\n"); + } + else // "ENQ" 以外の処理 + { + if (isalpha(str[0])) // 先頭が A ~ Z, a ~ z の場合 + { + if (str == "ACTIVE") sw = true; + if (str == "THROUGH") sw = false; + } + else // 先頭が A ~ Z, a ~ z 以外の場合 + { + // PC から送信されるデータの範囲: 0 ~ 5000 + // param の値に変換する,0 <= param <= 1 + param = atoi(str.c_str())/5000.0f; + + // PC の Label に表示する文字列を送信 + SendParm(param); + } + } +} + +// パラメータの値を送信(必要に応じて sprintf() の内容を変えること) +void SendParm(float param) +{ + char buf[32]; + // Tera Term を使わない場合は,"\r" は無くても構わない + sprintf(buf, "L音量: %3d %%\r\n", (int)(param*100)); + rxTx_.Tx(buf); // label1 に表示する文字列を送信 +}