stackoverflow に関するこの非常に興味深いトピックを読んだ後 -->ループでさらにデータを送信する前に COM ポートの受信イベントを待機する方法
私は多くの問題に遭遇し、多くの解決策を試しました...残念ながらうまくいきません!
多くのシリアル ポート ライブラリはイベント ドリブンであり、それらを理解するのに苦労しています。
Asyncpro、Synaser、および TComport を試しました。
次のような機能を持つことは可能ですか?
SerialSendandReply(tx string here,timeout) は rx 文字列を返し、タイムアウトの場合はエラー文字列を送信します
デバイスからの応答はミリ秒以内であり、それを行うためのブロック方法はより良いでしょうか?
このような:
Dosomething here
showmessage(SerialSendandReply('test',100 )); //100 ms timeout
dosomething else
このコードで
TForm1 = class(TForm)
...
private
IOEvent : THandle; // used for IO events
IORx : string;
Comport : TapdComport;
...
procedure TForm1.ComportTriggerAvail(CP: TObject; Count: Word);
var i : integer;
begin
for i:=1 to Count do
IORx:=IORx+Comport.GetChar;
SetEvent(IOEvent);
end;
function TForm1.SerialSAWR(tx : string; TimeOut : integer) : boolean;
begin
Result := False;
try
IORx := ''; // your global var
ResetEvent(IOEvent);
Comport.PutString(tx);
Result := WaitForSingleObject(IOEvent, TimeOut) = WAIT_OBJECT_0;
except
on E : Exception do
// dosomething with exception
end;
end;
// constructor part
IOEvent := CreateEvent(nil, True, False, nil);
// destructor part
if IOEvent <> 0 then
CloseHandle(IOEvent);
次に、この関数を呼び出そうとしました:
if SerialSAWR('test'; 5000) then showmessage(IORx);
送信はうまく機能していますが、文字列には何も返されません。
何かアドバイスはありますか?
どうもありがとうございました!
よろしく、ローラン