OnCommReceive Read(Buf,Size)
データーの受信には、出来る限り、受信イベントを使用します。
ポーリングによりデーターが読み取りバッファに入ったことをチェックして読み取る方法もありますが、推奨出来ません。
イベントの
OnCommReceive をダブルクリックすると、ユニットに割り込み実行用ルーチンが追加されます。
例
var
InString: string;
//グローバル文字変数 アプリバッファ
BufString: string;
//グローバル文字変数 型変換用
WrString: string;
//グローバル文字変数 処理用
const
DelimiterCh = #10;
procedure Comm1CommReceive(Sender: TObject; Size: Cardinal); //割り込み実行ルーチン
var
Buf: Pchar;
i: integer;
begin
Buf := AllocMem(Size + 1); //メモリー確保
Comm1.Read(Buf,Size); //受信データー読み出し
Read(Buf:pchar, Size:integer)
BufString := Buf; //pchar ->
string 型変換
InString := InString + BufString; //アプリバッファに加算
For i := 1 to length(InString) do
begin
if InString[i] := DelimiterCh then // #10(改行文字の
)の検索
begin
WrString := Leftstr(InString,i); // 区切りより左文字抽出
InString := Rightstr(InString,Length(InString) - i); //区切りより右文字抽出
break;
end;
end;
FreeMem(Buf,Size + 1); //メモリーの解放
*
WrStringの解析をここで行い必要な処理を行う
end;
InStringは、
Comm Open時に、
inString := ''; としてクリアしておきます。
通信中、上記例では、
#10以後のデーターが次の受信時の先頭のデーターとなります。
無手順での通信例です。
区切り時間無く、数個の
#10(改行
)を含む連続データーが送られる場合は、先に
#10(改行
)を数えておき、その数の分、ループを回す必要があります。