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.