パソコン(PC)のRS-232Cやその他のCOMポート経由シリアル通信用のターミナルソフト(Delphi版)は2006年12月10日に報告しました(PSoCでGPS?ついでにDelphiでシリアル通信ターミナルソフトを作ってみました、、、)。GPSモジュールからのNMEA信号をPCで表示するのに利用しました(GPSの通信速度は通常は4800ボー)。最近、ParallaxのPropellerからUSB経由で送られたシリアル通信データをPCで表示するのに使おうと思ったのですが(3月30日の報告)、通信速度57600ボーには対応していませんでした。そこで通信速度の選択肢を追加しようと思ったのですが、1年以上前なのでプログラムの作り方をすっかり忘れていました。この通信ターミナルソフトはMSComm32.ocxというシリアル通信用ActiveXコンポーネントのVisual Basicでの使い方を参考に自作したものです。このMSComm32.ocxというコンポーネントをDelphiやC++Buider用の通信コンポーネントとして流用してしまいましょうという訳です。
Delphiの色々なコンポーネントの使い方を思い出したついでに備忘録としてDelphi(Object Pascal言語)を用いたシリアル通信プログラムの作り方をまとめておくことにしました(C++Builderでも文法がC言語というだけで全く同様にして作れます)。使っている開発ソフトはDelphi5です(かなり前の旧バージョン;Delphi最新版ではどのような変更があるのか確認しておりません)。MSComm32.ocxがパソコンにインストールされていない場合には、例えば、VECTORのソフトウェア・ライブラリから”VB6 ランタイム”をキーワードにして検索すると見つかります(http://www.vector.co.jp;Visual Basic 6.0 SP6 ランタイムライブラリ;ダウンロードしたEXEファイルを起動すればランタイムライブラリが自動的にインストールされます)。
MSComm32.ocxがウィンドウズパソコンにインストールされていれば、シリアル通信ターミナルソフトの作り方の手順は以下の通りです:
1)DelphiをスタートしたらMSCommをインポートする(右の第1、第2のキャプチャ画像)
VB6用のランタイムライブラリをインストールしておくとMicrosoft Comm Control 6.0(MSComm32.ocxのこと)がImport ActiveXでリストに追加されていることが分かります。これをクリックしてインストールするコンポーネントパレットの名前(ActiveX)を選んで、”Install”ボタンをクリックします。そうするとInstallウィンドウが開きます。ここで”Into existing package”タブを選んでdclusr50.dpkに組み込みました。
2)Form1上に各コンポーネントを配置してゆく(右の第3のキャプチャ画像)
MSCommがコンポーネントパレットのActiveXに登録されれたことを確かめてからシリアル通信ターミナルソフトのForm1をビジュアルにデザインしておきます。乗せるコンポーネントは、Labelが4つ、Memoが1つ、Editが1つ、Buttonが4つ、Panelが1つ、Status Barが1つ(Win32にあります;プロパーティのPanelsでPanels[0]を追加しておきます;パネルは必要ならIEブラウザーのように複数乗せられます)、ComboBoxが2つ、SaveDialogが1つ、そして最後にMSCommが1つです。
3)OnFormCreateとOnFormCloseイベント処理(右の第4のキャプチャ画像)
まず、ターミナルソフトの初期化処理と終了処理用のコードを書いておきました。初期化処理を書くには、Form1のコンポーネントがない部分をクリックしてから画面左のオブジェクトインスペクタで”Events”タブをクリックしてOnCreateの右欄のところ(白抜きになる)をダブルクリックするとOnCreateイベント処理用のプロシージャ(TForm1.FormCreate)が自動的に作成されてエディタが表示されます。ここで、以下のようにコードを書き込みました。シリアルコムポートは1、速度9600ボーで初期化されます。その他のパラメータは上記のVBでの使い方のサイトを参照しました。フォームの一番下に貼り付けたステータスバーにそのパラメータが反映されるようにしました(ComboBox1.TextでCommPortの数値を文字列に変換してあります;このテキストも初期値は’1’にしてあります)。Button1でシリアル通信のスタートと停止をするようにしたので、初期化時にボタンの表面にオン・オフが可能であることを示す表示を付けることにしました。
----------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
MSComm1.CommPort := 1;
MSComm1.Settings := '9600,n,8,1';
MSComm1.InputLen := 1;
MSComm1.InBufferCount := 0;
MSComm1.RThreshold := 1;
MSComm1.SThreshold := 1;
StatusBar1.Panels[0].Text := 'COM' + ComboBox1.Text + ' ' + MSComm1.Settings;
Button1.Caption:='通信 on/off';
end;
-----------------------------------------------------------------
ターミナルソフト終了時の処理も同様にOnCloseイベント用にエディタを起動させ以下のように、もしもシリアル通信ポートが開いたままのときには念のためポートを閉じてソフトを終了します。
------------------------------------------------------------------
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if MSComm1.PortOpen = true then MSComm1.PortOpen := false;
end;
------------------------------------------------------------------
残り後半は次回(その2)に続きます。