イメージ 1

5000文字制限のためのその10の続きです。
添付する画像がなかったのでシリアルインターフェース(Arvel)を載せました。
以下つづきになります。
--------------------------------------------------------------------------------
ここの部分は前後しますがトップのグローバルスコープエリアに桁の重みの固定値を設定しておきます。
const int KAIJ0=1;
const int KAIJ1=16;
const int KAIJ2=256;
const int KAIJ3=4096;
const int KAIJ4=65536;
const int KAIJ5=1048576;
const int KAIJ6=16777216;
const int KAIJ7=268435456;
--------------------------------------------------------------------------------
   GOUKEI = ( KAIJ7 * VALSUCHI[2])+(KAIJ6 * VALSUCHI[3])+(KAIJ5 * VALSUCHI[4])+(KAIJ4 * VALSUCHI[5])+(KAIJ3 * VALSUCHI[6])+(KAIJ2 * VALSUCHI[7])+(KAIJ1 * VALSUCHI[8])+(KAIJ0 * VALSUCHI[9]);

   int Frequency=0;
   Frequency=(GOUKEI * 0.625);//周波数を求めます。小数点等はなしの数値のみ

   // 周波数の数字の集まりですが区切りを表す"."がないので周波数範囲で表示用に組み立てます。
   String^ mojiFreq;       //周波数を文字化して入れる変数
   mojiFreq=Frequency.ToString();      //文字化します。
   int lenFrequency=0;       //文字化の長さ用
   lenFrequency=mojiFreq->Length;      //長さを求めます。
   array<String^>^awasu=gcnew array<String^ >(10); //表示用の配列
array<String^>^mojika=gcnew array<String^ >(lenFrequency);//抜き出した1文字ごとの周波数データ用配列
int lpc=0;
   for (lpc=0; lpc<=lenFrequency-1 ;lpc++){
mojika[lpc]=mojiFreq->Substring(lpc,1); //一文字を周波数文字列から抜き出して配列へ
   }
--------------------------------------------------------------------------------
上記のGOUKEIに0.625Hz(STEP)をかけると(Hz)での周波数が求まります。
以上で周波数の表示データが一応は求まったことになります。このままでもいいのですが、やはり無線機の表示と同じ表示にしたい願望が出てきます。
たとえば上記のプログラムで求めた周波数データは周波数が
21.192.00
の場合は
21192000
というデータでもとまっていますのでこれを無線機の表示とあわせるための変換を行います。最後の0は表示では出ていないので、使いません。
プログラムではFrequencyデータを文字化して、文字長を出します。この文字長が無線機の周波数表示では次の3種類に分類されます。6桁(1MHzより下)、7桁(1MHzより9.99999MHzまで)、8桁(10.000.00MHzより30.000.00MHzまで)データではもう一桁ありますが、無線機では表示されていません。上記の周波数データとしては0がもう一つあります。表示部のコーディングを画像で載せています。5000文字制限でこのページはその11になっています。画像はその10にあります。

またコードを全部は載せてはいませんが、使った配列の宣言がバイト型とストリング型配列の場合の主な宣言方法は以下の2つです。
---------------------------------------------------------
array<Byte>^ bin;
bin=gcnew array<Byte>(16);
一行では
array<Byte>^ bin=gcnew array<Byte>(16);
---------------------------------------------------------
array<String^>^binasc=gcnew array<String^ >(16);
---------------------------------------------------------
また16進の文字への変換方法は
int aa=16;
int abc=0;
for(abc=0;abc<=aa-1 ;abc++){
binasc[abc]=bin[asc].ToString("X");
}
---------------------------------------------------------
以上ざっと書きましたが、今回多用した配列arrayの場合のエラーとして、カッコがありました。最初はまったく気がつきませんでしたが、VisualBasicのときの配列と同じ()のカッコを使ってしまったためにエラーが出ました。C++では[]です。
---------------------------------------------------------
以上で周波数表示用のラベルには無線機と同じ周波数の表示をするルーチンができたことになります。コードでは追加してありますが、タイマーコントロールを追加して、スタートボタン押下にて周波数を定期的に読み取り表示するようにしてあります。タイマールーチンでは ボタン21に割り当てた今回のコードを以下のように呼び出しています。止める場合のボタンも追加しています。このようにするととても簡単です。
-------------------------------------------------------------------------------
private: System::Void timer3_Tick(System::Object^ sender, System::EventArgs^ e) {
button21_Click(sender,e);
}
-------------------------------------------------------------------------------
private: System::Void button22_Click(System::Object^ sender, System::EventArgs^ e) {
timer3->Interval=500;
timer3->Start();
}
-------------------------------------------------------------------------------
private: System::Void button23_Click(System::Object^ sender, System::EventArgs^ e) {
timer3->Stop();
}
-------------------------------------------------------------------------------
タイマー3開始のボタンを押すと無線機からのデータをリアルタイム(500msec毎)に読み取るようになります。無線機の周波数ダイアルを動かすと周波数のラベル表示もあわせて動きます。本日はこれにておしまい。次はタイマー動作時の表示追加とか、sメータの表示にしようか?それとも、コードの整理をしようか、とにかく暑いので風呂に入って汗をながしたいと思う。つづく 本当??