イメージ 1

イメージ 2

新たに構想をしてみたことを書いてみる。
何かというと現在ハムログはパソコンからシリアルケーブルで無線機に接続されて直接周波数をハムログとの間でやり取りが行われているわけだが、今回はコントロールというか制御を別のプログラムで行い、プログラムが周波数データをハムログへ送るという形式をとるのがいいのではないかと思えた。ハムログと無線機だけの周波数読み取りのみで使用する場合はいいが、他の制御もしてみたい場合は、プログラムが主体になる必要があるためだ。ということで、何をしたいのかといいますと シリアル通信で無線機を制御するということです。遠隔操作にやるにしても直接のパソコン制御にしても無線機には通信機能がついているものがたくさんありますのでこれを利用するわけです。VisualC++2010Expressを用いたシリアル通信をやってみます。すでにVisualBasic2008Expressにて無線機のシリアル制御プログラムはできていますので、これをC++/CLI用に書き換えてみます。
私の使用している無線機はYAESU FT-1000MPです。この無線機はCAT機能用としてRS232C端子を標準で装備しています。また今回のプログラムでの制御コマンドも、テクニカルオーバービューのCATコントロールコマンド表の並びで利用できるようにして組みます。
表表示は コマンド、パラメータの並びで一覧表となっています。例えばMODE(電波型式)の切り換えはUSBモードの場合
コマンド:0C
パラメータ:01、※、※、※
となっています。※は特に関係ないが00を入れます。
コマンド、パラメータの並びは表とおなじですので、コマンドを並べる場合はとても簡単にできます。USBモードの送出データは 次のように準備します。
送出データ:0C、01、00、00、00
これはあくまでもわかりやすくコマンドを使うためです。実際の通信データは並び替えて送出します。実際に送るコードの並びは 00、00,00,01,0Cです。これは通信フォーマットに通信データの構成のなかにパラメータ4、パラメータ3、パラメータ2、パラメータ1、MSDコマンドというふうに書かれています。また通信の設定として
通信速度:4800ビット/秒
データ長:8ビット
スタートビット:1ビット
ストップビット:2ビット
パリティビット:なし
上記を主にプログラムのシリアル通信の設定値として他も含め下記のように初期設定します。ポートは今回は固定COM4(私の都合)で指定しました。
SerialPort^ _serialPort1;
_serialPort1 =gcnew SerialPort();
_serialPort1->PortName = "COM4";
_serialPort1->BaudRate = 4800;
_serialPort1->Parity=System::IO::Ports::Parity::None;
_serialPort1->DataBits=8;
_serialPort1->StopBits= StopBits::Two;
_serialPort1->Handshake = System::IO::Ports::Handshake::None;
_serialPort1->RtsEnable=true;
_serialPort1->Open();
(ここには送受信のコードを書く)
_serialPort1->Close();
通信の終了には必ず上記のClose();を行います。
ここまでは単純な設定ですので、書き方さえ間違わなければ問題はないと思います。実際は少し悩みました(ストップビットの例がOneしかなくで2の場合は数字か、とか実際に試してみてTwoであることがわかりました。)

今回は無線機の制御コマンドの上記のUSBモードにするためのコードをString変数に代入してこれを型変換を用いてシリアル送出用のデータに書き換えてから無線機のシリアルデータラインへ送ることを行います。
各配列を準備します。

array<String^>^indat=gcnew array<String^ >(10); //0から9のindat配列用意されます。
arary<String^>^bun=gcnew array<String^ >(5); // 0から4のbun配列用意されます。
array<Byte>^ kako;
kako=gcnew array<Byte>(5); // 0から4のバイト型kako配列用意されます。

上記の配列はcntcomdatに入れたデータを一旦String配列に入れて、なおかつ2文字ごとにまとめるという変換で使います。

cntcomdatにUSBデータをセットします。
次にデータの長さを求めます。10ですが...
----------------------------------------
String^cntcomdat="0C01000000";
nagasa=cntcomdat->Length;  
---------------------------------------- 
まずは1文字ずつの抜き出しを行いindat配列に入れます。
----------------------------------------
for (a1=0; a1<=nagasa-1 ; a1++){
indat[a1]=cntcomdat->Substring(a1,1);
}
----------------------------------------
次に2文字ごとにペアにします。
----------------------------------------
for (a4=0 ;a4<=comlength-1 ; a4++){
bun[a4]=indat[2*a4]+indat[2*a4+1];
}
----------------------------------------
シリアルにはバイト配列でデータを送るようになっているので変換をします。このときに先の送出用データ5個のデータの並び替えを行います。
----------------------------------------
kako[0]=(char::Parse(bun[4],System::Globalization::NumberStyles::HexNumber));
(以下同じ型式なので省略)
----------------------------------------
後はデータを送ります。comlengthはグローバル宣言でconstで5に初期化しています。送出後にシリアルポートを閉じます。
----------------------------------------
_serialPort1->Write(kako,0,comlength);
_serialPort1->Close();
----------------------------------------
上記の設定でプログラムのUSBコマンドボタンを押すと、無線機のモードがUSBに変わります。ボタン一つしかないと変わったかわからないので別にFMモードもボタン一つ追加してデータ以外はまったく同じコードで動かしています。同じコードでも動くところがCの強みですね。ちなみにコマンドは 
String^ cntcomdat="0C06000000"; // FM 
です。
コマンドで制御ができるようになるといろいろと試したくなると思います。VBでの制御ではいろいろとやりました。VisualC++2010Expressでもシリアル通信の送りと受けがありますので今回の送りは良しとして、受信も試していこうかと思います。まずはいろいろと調べる必要があります。何せC++/CLIは修行の身です。簡単にVBの書き換えでいけば良いのですが。。。。なんか最近は早朝のブログ作成が多くなってきたようだ。もう一眠りしようかしらん!少し眠くなってきた。おわり