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

Dependencies:   mbed SerialTxRxIntr F446_AD_DA_Multirate

Revision:
3:42f9127d578d
Parent:
2:1aff436cba4a
Child:
4:3087a0841304
--- a/main.cpp	Fri Sep 28 08:14:19 2018 +0000
+++ b/main.cpp	Sun Oct 07 03:31:07 2018 +0000
@@ -6,7 +6,7 @@
 //  処理の内容:AD 変換器からの入力に倍率を乗算し DA 変換器に出力する
 //            倍率は PC からの指令で変更する
 //            PC からの指令: 0.00 ~ 1.00 倍
-//            出力は PC からの指令により On/Off の切り替えが可能
+//            乗算あり/なしは PC からの指令により ACTIVE/THROUGH の切り替えが可能
 //
 //            "ENQ” を除く PC からの指令については,そのまま PC へ送る
 //
@@ -14,7 +14,7 @@
 //      F446_AD_DA_Ctrl
 //      端末エミュレータでも使用可能
 //
-//  2018/09/28, Copyright (c) 2018 MIKAMI, Naoki
+//  2018/10/06, Copyright (c) 2018 MIKAMI, Naoki
 //----------------------------------------------------------------------
 
 #include "F446_Multirate.hpp"
@@ -31,6 +31,8 @@
 int main()
 {
     printf("\r\n端末エミュレータでも使用可能\r\n");
+    printf("端末エミュレータから数値を入力する場合は 0 ~ 65535 の\r\n");
+    printf("範囲の数値を入力してください\r\n");
     rxTx_.EchobackEnable();     // エコーバックを有効にする
 
     // 以下の割り込み優先順位の設定を忘れないこと
@@ -46,7 +48,7 @@
         //------------------------------------------------------------
         // ここにディジタルフィルタ等の処理を記述する
         float xn = myAdDa_.Input(); // 入力
-        float yn = sw ? volume*xn : 0;
+        float yn = sw ? volume*xn : xn;
         myAdDa_.Output(yn);         // 出力
         //------------------------------------------------------------
 
@@ -55,21 +57,37 @@
         if (rxTx_.IsEol())          // 受信バッファのデータが有効になった場合の処理
         {
             string str = rxTx_.GetBuffer();
-            if (str.find("ENQ") != string::npos)
-                rxTx_.Tx("ACK");    // PC からの "ENQ" に対して "ACK" を送信する
+            if (str == "ENQ")
+            {
+                rxTx_.Tx("ACK\n");      // PC からの "ENQ" に対して "ACK" を送信する
+                rxTx_.Tx("LVolume: 0.4000\n");
+                char buf[16];
+                sprintf(buf, "S%5d\n", (uint32_t)(65535*0.4f));
+                rxTx_.Tx(buf);  // スライダ(TrackBar)の位置を送信
+            }
             else    // "ENQ" 以外の処理
             {
                 if (isalpha(str[0]))    // 先頭が A ~ Z, a ~ z の場合
                 {
-                    if (str.find("ON") != string::npos)  sw = true;
-                    if (str.find("OFF") != string::npos) sw = false;  
+                    // 大文字に変換する
+                    for (int n=0; n<str.size(); n++)
+                        str[n] = toupper(str[n]);
+                    
+                    if (str == "ACTIVE")  sw = true;
+                    if (str == "THROUGH") sw = false;  
                 }
                 else                    // 先頭が A ~ Z, a ~ z 以外の場合
+                {
                     // float 型のデータとみなして数値化する
-                    volume =  atof(str.c_str());
+                    volume = atoi(str.c_str())/65535.0f;
+                    char buf[32];
+                    sprintf(buf, "LVolume: %6.4f\r\n", volume);
+                    rxTx_.Tx(buf);
+                }
             }
         }
         // PC からの指令に対応する処理はここまで
         //------------------------------------------------------------
     }
 }
+