t使用Delphi 10.3在控制台应用程序中导入
我在一个简单的Delphi10.3控制台应用程序中使用TComPort(4.11f),请参见下文,但我没有得到任何数据 在VCL应用程序中使用相同的代码可以很好地工作。有什么想法吗 我猜我没有正确连接t使用Delphi 10.3在控制台应用程序中导入,delphi,console-application,tcomport,Delphi,Console Application,Tcomport,我在一个简单的Delphi10.3控制台应用程序中使用TComPort(4.11f),请参见下文,但我没有得到任何数据 在VCL应用程序中使用相同的代码可以很好地工作。有什么想法吗 我猜我没有正确连接ComDataPacket1和ComPort1对象。然而,我找不到另一种方法来做这件事 program commapp; {$APPTYPE CONSOLE} uses Vcl.Forms, CPort, CPortCtl, system.sysutils, classes, Windows
ComDataPacket1
和ComPort1
对象。然而,我找不到另一种方法来做这件事
program commapp;
{$APPTYPE CONSOLE}
uses
Vcl.Forms, CPort, CPortCtl, system.sysutils, classes, Windows;
{$R *.res}
var
ComPort1: TComPort;
ComDataPacket1: TComDataPacket;
Sender: TObject;
Str: string;
type
TEventHandlers = class
class procedure ComDataPacket1Packet(Sender: TObject; const Str: string);
end;
class procedure TEventHandlers.ComDataPacket1Packet(Sender: TObject; const Str: string);
begin
WriteLn('Inside the proc with ' + str);
end;
begin // Main program ///
ComPort1 := TComPort.Create(nil); // create the comm
ComDataPacket1 := TComDataPacket.Create(nil);
ComPort1.BaudRate := br115200; // set parameters
ComPort1.Port := 'COM3';
ComPort1.Parity.Bits := prNone;
ComDataPacket1.Size := 33;
ComDataPacket1.ComPort := ComPort1;
ComDataPacket1.OnPacket := TEventHandlers.ComDataPacket1Packet;
ComDataPacket1.StartString := '';
ComDataPacket1.StopString := '';
if ParamCount = 0 then // no paramters passed enter menu
begin
ComPort1.ShowSetupDialog; // Open the port settings.
ComPort1.Open;
ComPort1.WriteStr('b') ; // Send the command to start sending data
WriteLn('After sending an b I get : ' + str);
ReadLn;
end;
// release the components
ComDataPacket1.Free;
ComPort1.Free;
end.
尝试在等待触发
OnPacket
事件时运行消息循环,例如:
program commapp;
{$APPTYPE CONSOLE}
uses
Vcl.Forms, CPort, CPortCtl, System.SysUtils,
System.Classes, Winapi.Windows, System.SyncObjs;
{$R *.res}
var
ComPort1: TComPort;
ComDataPacket1: TComDataPacket;
DataEvent: TEvent;
hEvent: THandle;
DataStr: string;
type
TEventHandlers = class
class procedure ComDataPacket1Packet(Sender: TObject; const Str: string);
end;
class procedure TEventHandlers.ComDataPacket1Packet(Sender: TObject; const Str: string);
begin
WriteLn('Inside the proc with ' + Str);
DataStr := Str;
DataEvent.SetEvent;
end;
begin // Main program
ComPort1 := TComPort.Create(nil); // create the comm
ComDataPacket1 := TComDataPacket.Create(nil);
DataEvent := TEvent.Create;
ComPort1.BaudRate := br115200; // set parameters
ComPort1.Port := 'COM3';
ComPort1.Parity.Bits := prNone;
ComDataPacket1.Size := 33;
ComDataPacket1.ComPort := ComPort1;
ComDataPacket1.OnPacket := TEventHandlers.ComDataPacket1Packet;
ComDataPacket1.StartString := '';
ComDataPacket1.StopString := '';
if ParamCount = 0 then // no paramters passed enter menu
begin
ComPort1.ShowSetupDialog; // Open the port settings.
end;
ComPort1.Open;
ComPort1.WriteStr('b') ; // Send the command to start sending data
hEvent := DataEvent.Handle;
repeat
case MsgWaitForMultipleObjects(1, hEvent, False, INFINITE, QS_ALLINPUT) of
WAIT_OBJECT_0: Break;
WAIT_OBJECT_0 + 1: Application.HandleMessage; // or Application.ProcessMessages()
WAIT_FAILED: RaiseLastOSError;
end;
until False;
WriteLn('After sending an b I get : ' + DataStr);
ReadLn;
// release the components
DataEvent.Free;
ComDataPacket1.Free;
ComPort1.Free;
end.
在VCL应用程序中是否也使用类过程作为事件处理程序?有空哨兵的数据包的目的是什么?不,这是一个区别。如果我没有将proc包装在一个类中,我会在下面的链接中得到一个错误。因此,我将其包装在一个类中,以使编译器满意。如果我输入或取出,空的开始字符串和停止字符串没有任何区别,它们在两个版本中都存在。但是您可以在不使用
类
的情况下使用常规方法(但创建TEventHandlers
实例)。true,但是,将类取出并创建Teventhandler的实例并将其附加到Comport并没有任何区别。ReadLn
不足以等待事件在控制台应用程序中处理。就像@RemyLebeau所说的,您必须为要处理的事件实现一个消息循环。感谢您提供的示例代码。运行它时,我在MsgWaitForMultipleObjects(1,DataEvent.Handle,False,INFINITE,QS_ALLINPUT)上收到一条错误消息,声明“常量对象不能作为var参数传递”,我相信是指DataEvent.Handle。我查了一下,试图给它传递一个指向无效的指针,还尝试将该参数设置为常规参数。后者可以工作,但不再附加到事件,我想是的,没有数据。@user3338048对此表示抱歉。我调整了我的答案。谢谢你的编辑,效果很好。我已经接受了答案。