Delphi は、強力な機能、使いやすさ、および高速なコード実行という利点を備えた視覚的な高速アプリケーション開発ツールであり、多くのプログラマーがさまざまなアプリケーションの開発ツールとして Delphi を選択するようになっています。 。ただし、問題は、Delphi には独自のシリアル通信制御がなく、ヘルプ ドキュメントにもシリアル通信についての記述がないため、通信プログラムをコンパイルする開発者にとっては非常に不便です。
現在、Delphi を使用してシリアル通信を実装するには 3 つの方法が一般的に使用されています。1 つは MSCOMM コントロールや SPCOMM コントロールなどのコントロールを使用する方法、もう 1 つは API 関数を使用する方法、3 つ目は他のシリアル通信プログラムを呼び出す方法です。その中でも、APIを使用してシリアル通信プログラムを作成するのはより複雑であり、多くの通信知識が必要です。それに比べて、SPCOMM コントロールの使用は比較的簡単で、このコントロールにはシリアル ポート通信に密接に関連した豊富なプロパティとイベントがあり、シリアル ポート上でさまざまな操作を提供し、マルチスレッドもサポートしています。次の記事では、SPCOMM コントロールの使用法を例とともに詳しく紹介します。
SPCOMM のインストール
1.ドロップダウン メニューの [コンポーネント] で [コンポーネントのインストール] オプションを選択し、ユニット ファイル名に SPCOMM コントロールが配置されているパスを入力します。他の項目にはデフォルト値を使用でき、[OK] ボタンをクリックします。
2.インストール後、システム コントロール パネルに赤い制御 COM が表示されます。これで、COM コントロールを Delphi 独自のコントロールと同じように使用できるようになりました。
SPCOMM のプロパティ、メソッド、およびイベント
1.属性
●CommName: COM1、COM2などのシリアルポートの名前を示します。
●BaudRate: 実際のニーズに応じて設定されたボー レート。シリアル ポートが開いた後もこの値を変更でき、実際のボー レートもそれに応じて変わります。
●ParityCheck: パリティチェックが必要かどうかを示します。
●ByteSize: 実際の状況に応じて設定されたバイト長。
●パリティ:パリティビット。
●StopBits: ストップビット。
●SendDataEmpty: これはブール型属性で、true の場合は送信バッファが空であるか、送信キューに情報がないことを意味します。false の場合は送信バッファが空でないことを意味します。送信キュー内の情報です。
2.方法
●Startcomm メソッドを使用してシリアルポートをオープンします。オープンに失敗した場合、通常はエラーが報告されます。エラーには主に 7 つの種類があります。 ⑴ シリアル ポートが開かれています。 ⑵ シリアル ポートを開く際のエラーです。 ⑷ 通信キャッシュをインストールできません。読み取りプロセスを生成できません。 ⑺ 書き込みプロセスを生成できません。
●StopComm メソッドはシリアル ポートを閉じるために使用され、戻り値はありません。
●WriteCommData(pDataToWrite: PChar;dwSizeofDataToWrite:Word) メソッドは、書き込みプロセスに文字列を送信するために使用され、送信が成功した場合は true を返し、送信が失敗した場合は false を返します。この関数を実行するとすぐに戻り値が取得され、その後送信操作が実行されます。この関数には 2 つのパラメータがあり、pDataToWrite は送信される文字列、dwSizeofDataToWrite は送信される文字列の長さです。
3.イベント
●OnReceiveData :オブジェクトのPROcedure (Sender: TObject;Buffer: Pointer;BufferLength: Word)
このイベントは、シリアル ポートから受信したデータを処理できるバッファにデータが入力されるとトリガーされます。 Buffer には受信データが含まれ、BufferLength は受信データの長さです。
●OnReceiveError: プロシージャ(送信者: TObject; イベントマスク: DWORD)
このイベントは、データの受信中にエラーが発生した場合にトリガーされます。
SPCOMMの使用
以下は SPCOMM 制御を使用したシリアル通信の例です。
PC とマイクロコントローラー 8051 の間の通信を例にとると、最初にそれらの間のハンドシェイク信号を調整する必要があります。両者間の通信プロトコルは、PC から 8051 への 1 フレームのデータが 6 バイト、8051 から PC への 1 フレームのデータも 6 バイトであるとします。 PC が (F0,01,FF,FF,01,F0) を送信すると、8051 はデータ通信ハンドシェイクが成功したことを示すフレーム (F0,01,FF,FF,01,F0) を受信でき、2 つはその後に続きます。プロトコルは相互にデータを転送します。
新しいプロジェクト COMM.DPR を作成し、フォームの NAME プロパティを FCOMM に設定し、フォームのタイトルを Test Communication として定義し、対応するコントロールを追加します。
1. COMM1 属性を設定します。
●ボーレート:4800。
●パリティビット:なし。
●バイト長:8。
●ストップビット:1。
●シリアルポート:COM1。
送受信したデータはメモ1に表示されます。新しいフォームを Comm.pas として保存します。
2.ソースコードを書く
//変数の説明
変数
fcomm:TFCOMM;
ビュー文字列:文字列;
i:整数;
rbuf,sbuf:配列[16] バイト;
//シリアルポートを開く
プロシージャ TFCOMM.FormShow(送信者: TObject);
始める
comm1.StartComm;
終わり;
//シリアルポートを閉じる
プロシージャ TFCOMM.FormClose(Sender: TObject; var Action: TCloseAction);
始める
comm1.StopComm;
終わり;
// データ送信プロセスをカスタマイズする
プロシージャ送信データ;
変数
i:整数;
commflg:ブール値;
始める
ビュー文字列:='';
commflg:=true;
for i:=1 ~ 6 を実行します
始める
fcomm.comm1.writecommdata(@sbuf[i],1) でない場合は、
始める
commflg:=false;
壊す;
終わり;
//送信時のバイト間の遅延
スリープ(2);
viewstring:=viewstring+intttohex(sbuf[i],2)+'';
ビュー文字列:='送信'+ビュー文字列;
fcomm.memo1.lines.add(ビュー文字列);
fcomm.memo1.lines.add('' );
commflg でない場合は messagedlg('送信失敗!',mterror,[mbyes],0);
終わり;
//ボタンクリックイベントを送信
プロシージャ TFCOMM.Btn_sendClick(送信者: TObject);
始める
sbuf[1]:=byte($ f0); //フレームヘッダー
sbuf[2]:=byte($01); //コマンド番号
sbuf[3]:=バイト($ ff);
sbuf[4]:=バイト($ ff);
sbuf[5]:=バイト($01);
sbuf[6]:=byte($ f0); //フレームの終わり
senddata;//送信関数を呼び出す
終わり;
//受信処理
プロシージャ TFCOMM.Comm1ReceiveData(送信者: TObject; バッファ: ポインタ; バッファ長: Word);
変数
i:整数;
始める
ビュー文字列:='';
move(buffer^,pchar(@rbuf^),bufferlength);
for i:=1 からbufferlength do
viewstring:=viewstring+intttohex(rbuf[i],2)+'';
ビュー文字列:='受信'+ビュー文字列;
memo1.lines.add(ビュー文字列);
memo1.lines.add('' );
終わり;
memo1 に送信 F0 01 FF FF 01 F0 と受信 F0 01 FF FF 01 F0 が表示された場合、シリアル ポートがデータを正しく送信し、データを正しく受信し、シリアル通信が成功したことを意味します。