在阅读了关于 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);
发送效果很好,但不返回字符串中的任何内容。
有什么建议吗?
非常感谢你!
问候,劳伦特