F7, ※, ※, ※, P4
ここでのパラメータP4は00がメイン(VFO-A)Sメータです。ちなみにSUB(VFO-B)Sメータは01、POメータが80、....と割り当てられています。
今回は00のメインVFO-AのSメータですので、コマンドは
F7,00,00,00,00
になります。このコマンドをft1000mpcomで送出します。
String^ cntcomdat;
String^ retda;
String^ backdata;
cntcomdat="F700000000";
retda="NONE";
backdata=ft1000mpcom(cntcomdat,retda);
このbackdataにシリアル通信でのSメータ値が返るように関数化したft-1000mpcom上で処理を行い値を返すようにします。
コマンドに対するFT-1000mpからのCATデータは4バイト+1バイトの値が返ってきます。最初の4バイトはSメータの値を4バイト分と、送ったSメータコマンドF7がそのまま返ってきます。
例)8C8C8C8CF7
ここでft-1000mpcom関数ではSメータリクエストのF7をチェックして、該当するコマンドの場合は上記データ5バイトを読み取りを行います。他にもデータを返すものとして、CATコントロールコマンド表のNo.29の内部ステータスの呼び出しFAがありますので、後々様にこれも検出できるように次のようにしておきます。
以下主要部コードです。
------------------------------------------------------------------------------
array<Byte>^ bin;
bin=gcnew array<Byte>(5);
array<String^>^ binasc=gcnew array<String^ >(5);
array<String^>^ ainasc=gcnew array<String^ >(5);
int rbuf;
int i;
int j;
int k;
int ad;
String^ retdat;
if ((kako[4] == 0xFA) | (kako[4] == 0xF7)){
int ac=0;
for(ac=0;ac<=4;ac++){
bin[ac]=_serialPort1->ReadByte(); //ここで返り値を読み取ります
}
//ここにはbin[ac]を加工するルーチンがあります。
// 16進の文字列化、一桁のデータを2桁にする
//1バイトずつ読み取ったデータを連結する処理など 8C8C8C8CF7
for (i=0; i<=4 ; i++){
binasc[i]=bin[i].ToString("X");
}
int lenasc;
for(j=0 ; j<=4 ; j++){
lenasc=binasc[j]->Length;
if(lenasc==1){
ainasc[j]="0"+binasc[j];
{else{
ainasc[j]=binasc[j];
}
}
txretda="";
retdat="";
for (k=0 ; k<=4 ; k++){
txretda=txretda+ainasc[k];
}
retdat=txretda;
_serialPort1->Close();
textBox15->Text=retdat;
return retdat;
}else{
retdat=txretda;
textBox15->Text=retdat;
_serialPort1->Close();
return retdat;
}
_serialPort1->Close();
------------------------------------------------------------------------------
該当コマンド以外は通常の処理で"NONE"を返します。
以上でSメータコマンドがくると現在のSメータ値とコマンドの5バイトが返ってくるようになります。この5バイトをSメータの表示用に利用するわけです。いろいろな方法があるとは思いますが、まずこの返ってくる値5バイト中の最初の1バイト分の(HEX)を使いました。単純に00からFFまでの範囲をとる値です。これがわかるとプログレスバーに単純にMAX値を設定し後は読み取った値をValue設定するだけでSメータらしく動きます。以下プログレスバーのコードです。
------------------------------------------------------------------------------
int sdat;
int snagasa;
String^ picksdat;
snagasa=(backdata)->Length;
picksdat=backdata->Substring(0,2);
sdat=(Int32::Parse(picksdat,System::Globalization::NumberStyles::HexNumber));
progressBar1->Maximum=0xFF;
progressBar1->Value=sdat;
------------------------------------------------------------------------------
厳密にはSGで信号を入れて無線機でのSメータの正確なポイントデータを取得してSメータ表示させると精度が良くなります。今回はコード中のコメント整理ができてない為、主要部を手打ちコピペしました。先のタイマーコマンドの周波数読みボタンでタイマーを使うと周波数データ表示とSメータ表示がリアルタイムで表示できます。周波数の読み取りルーチンにSメータ読み取り処理を入れることがミソかと思います。だいぶ古い無線機ですのでCATシステムの情報がもう少しあってもいいのではないかと思いますが、プログラム内容を書いているものがほとんどないと思います。できたユーザとしてしか使えないアプリがアマチュア無線家としては寂しいですね。もちろんよくできたプログラムは勿論ありますが、できれば自分でプログラムできるほうが、楽しみも倍増すると思います。しかも無償の言語提供もされているわけですので、是非ともトライしてほしいと思います。とにかく自分で制御できることが最高です。つづく