PC から,リアルタイム信号処理を行っている Nucleo-F446 を制御する例.

Dependencies:   mbed SerialTxRxIntr F446_AD_DA_Multirate

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 &param);   // 受信バッファのデータが有効になった場合の処理
 
 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 &param)
+{
+    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 に表示する文字列を送信
+}