首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Delphi 10.3实现控制台应用程序中的Tcomport

使用Delphi 10.3实现控制台应用程序中的Tcomport
EN

Stack Overflow用户
提问于 2018-12-30 23:57:09
回答 1查看 1.6K关注 0票数 1

我在一个简单的Delphi10.3控制台应用程序中使用TComPort (4.11f),如下所示,但我没有得到任何数据。

在VCL应用程序中使用相同的代码工作得很好。有什么想法吗?

我的猜测是我没有正确地连接ComDataPacket1ComPort1对象。然而,我找不到其他方法来做这件事。

代码语言:javascript
复制
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.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-31 15:14:59

在等待OnPacket事件触发时尝试运行消息循环,例如:

代码语言:javascript
复制
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.
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53979112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档