送信時、書き込み完了をしてから、アプリケーションに実行を戻す場合は、
Comm1.CommWaitFors := [waitWrite];
を指定します。
(指定は、
RS232CデバイスをOPENする前に指定する必要があります。
)
書き込みが完了しない限り、
Comm1.Write(const Buffer:,Size: integer);の、ルーチンから戻りません。
データー長が、
FIFOバッファの空き内であれば、即戻ります。
書き込み時に、タイムアウト時間より長くなった場合は、完了を待たず戻ります。
その場合は、タイムアウト時間を長くしてください。
タイムアウトの時間を設定してあれば、その時間で終了し、タイムアウトエラーを発生します。
OutQueueの書き込みバッファを有効に利用したい場合は、プロパティ
waitWrite を
Fasleにするか
Comm1.CommWaitFors := []; 又は
Comm1.CommWaitFors := [waitRead]; 読み出しのみ
を指定します。
Comm1.SendString(S:string);を使用しても
Comm1.Write(Buffer,Size);を使用するため、同じ動作となります。
注
Win9x,MEの場合は、次のデーターを書き込むのは、必ず、書き込みバッファが空になってから次のデーターを書き込むようにして下さい、
OnCommTransmit、
Comm.RemainSizeを利用して下さい。
バッファの空き容量確認で書き込みを行うと、データーが正しく書き込まれないことがあります。
waitWriteが
Trueであれば、問題ありません。
確実に、送信するためには、
waitWriteを指定します。
送信速度が遅く、待ち時間が長い場合は、
waitWriteを指定せず、バッファに書き込まれたら、直ぐに制御が戻るようにする事が出来ます。
その場合、プログラムを終了する時に、書き込みデーターが残っている場合があります、未送信データーが無くなってからプログラムを終了しましょう。
例
指定無し
Comm1.CommWaitFors := []; 又は
Comm1.CommWaitFors := [waitRead];
procedure TForm.FormCloseQuery(Sender: TObject;var CanClose: Boolean);
begin
if (Comm1. RemainSize) > 0 then
CanClose:= False //書き込みが済んでなかったら、閉じない。
end;
指定有り
Comm1.CommWaitFors := [waitWrite];
Comm1.CommWaitFors := [waitRead, waitWrite];の様に、読み取り側の指定も同時に出来ます。