Lazarus on Raspberry Pi でシリアルを使う 2020/12/23

コンポーネントを追加せずにシリアルを使う情報がまったくなかったのですが、ここの下のほうににサンプルコードがありました。
uses節に Serial を追加するだけで使えます。

一応、USB-シリアル変換アダプタを使って送信-受信は出来ました。(D-sub9 ピンの 2-3 ピン短絡のエコーバックで確認)
COMポートの名前は、ls -l /dev/tty* で一覧表示されます。

USB-シリアル変換アダプタを使った場合のCOMポート名は、"/dev/ttyUSB0"。
※USB-シリアルを使う場合は、sudo usermod -aG dialout $USER で dialout グループに入れてアクセス権限の取得が必要です。

GPIO ピンを使った場合は、"/dev/ttyAMA0"。
※GPIO ピンを使う場合も、設定の変更が必要です。ネットで検索してみてください。

SerReadTimeout(..) の使い方が分かりませんでした。分かる方がおられたら教えて下さい。


unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls,
  Serial;
type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  comPortName : string;
  serHandle : THandle;
  serFlags : TSerialFlags;
  cmd : string;
  len : integer;
  ret : LongInt;
  timeout : longInt;
  //ticks : longInt;
  res, s : string;
  buf : array [0..63] of byte;
begin
  comPortName := '/dev/ttyUSB0'; // '/dev/ttyAMA0';
  serFlags := [];
  serHandle := SerOpen(comPortName);  // Error = -1
  if serHandle >= 0 then begin
    Edit1.Text := serHandle.ToString;
    SerSetParams(serHandle, 9600, 8, NoneParity, 1, serFlags);
    cmd := 'TEST COMMAND'+#13#10;
    len := cmd.Length;
    ret := SerWrite(serHandle, cmd, len);
    if ret > 0 then begin
      Edit1.Text := 'send';
      timeout := 100;
      res := '';
      s := '';
      sleep(10);
      while (res.Length < 10) and (ret >= 0) do begin
        ret := SerRead(serHandle, s, 10); // read 10 byte
        res := res + s;
      end;
      Edit1.Text := Trim(res);
    end
    else
      Edit1.Text := 'Unable to send';

    SerSync(serHandle);
    SerFlushOutput(serHandle);
    SerClose(serHandle);
  end;

end;

end.