Delphi 10 で ApdComPort を使う (2017/05/15)

※ 2017/05/18 TApdDataPacket、TApdSLController、TApdStatusLight コンポーネント、ログファイルのスクリーンショットを追加
※ 2017/05/21 日本語マニュアルがありました。TurboPower Async Professional リファレンス・ガイド 第2章

これまでは CPortLIB を使っていたのですが、GetIt からインストールできる ApdComPort を使ってみました。
ウェルカムページ で、「GetIt でアドオンを取得」 をクリックすると、GetIt パッケージマネージャ が開きます。



インストールすると、ツールパレットに APRO カテゴリが追加されます。
TApdComPort は、その中にあります。



データの受信は、ApdComPort1TriggerAvail(CP: TObject; Count: Word); イベントを使います。

終端文字が ETX、CRLF のように固定の場合は、TApdDataPacket コンポーネントを追加し、
ComPort プロパティを ApdComPort にします。
終端文字が CRLF の場合は、EndString を #13#10 (^M^J) に、StartCond を scAnyData に設定すると、
ApdDataPacket1StringPacket(Sender: TObject; Data: AnsiString); イベントで文字列として取得されます。

通信状態のランプは、TApdStatusLight コンポーネントを必要数追加、TApdSLController コンポーネントを1個追加し、
ApdSLController に ApdStatusLigh を登録。ApdSLController の ComPort プロパティに ApdComPort を設定します。
ApdSLController1.Monitoring := True; にすると、動くようになります。

COM ポート番号が有効であるかを確認するには、uses 節に、AdSelCom を追加し、IsPortAvailable() を使います。
ex: for i := 1 to 32 do if IsPortAvailable(i) then ComboBox1.Items.Add ( 'COM ' + IntToStr (i));

単体で、ログファイルの作成、追加ができます。
ASCII 表記

HEX 表記


// GetIt からアドオンを取得
// AsyncPro for VCL 1.3

var buf : string;

// 送信
procedure TForm2.Button1Click(Sender: TObject);
begin
  ApdComPort1.ComNumber := 5; // COM5
  ApdComPort1.Baud := 2400;
  ApdComPort1.StopBits := 1;
  ApdComPort1.DataBits := 8;
  ApdComPort1.Parity := TParity.pNone;
  try
    ApdComPort1.Open := True;
    buf := '';
    // 送信
    ApdComPort1.Output := 'ABCDEFGHIJKLMNOPQRS';
    ApdComPort1.PutString('1234678901324567890');
  except
    ShowMessage('ERROR');
  end;
end;

// 受信
//----------------------------------------------------------
// GetChar
//----------------------------------------------------------
procedure TForm2.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
var
  i: Word;
begin
  for i := 1 to Count do
    buf := buf + string(ApdComPort1.GetChar);
  Edit1.Text := buf;
end;

//----------------------------------------------------------
// Byte
//----------------------------------------------------------
procedure TForm2.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
var
  i: Word;
  B: array [0..1024] of Byte;
begin
  ApdComPort1.GetBlock(B, Count);
  for i := 0 to Count -1 do
    buf := buf + Char(B[i], 2);
  Edit1.Text := buf;
end;

//----------------------------------------------------------
// TBytes
//----------------------------------------------------------
procedure TForm2.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
var
  B: TBytes;
begin
  SetLength(B, Count);
  ZeroMemory(B, Count);
  ApdComPort1.GetBlock(B[0], Count);
  buf := buf + TEncoding.ANSI.GetString(B);
  Edit1.Text := buf;
end;