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.