Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Serielle Schnittstelle Terminalprogramm (https://www.delphipraxis.net/5994-serielle-schnittstelle-terminalprogramm.html)

Mr. Bean 25. Jun 2003 18:13


Serielle Schnittstelle Terminalprogramm
 
Hallo,
ich habe ein kleines Terminal Programm geschrieben. Allerdings kann ich bloß Zeichen senden aber keine Zeichen empfangen. Vielleicht habet ihr eine Ahnung wo der Fehler liegt.

Delphi-Quellcode:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Label1: TLabel;
    Memo2: TMemo;
    Label2: TLabel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Label3: TLabel;
    Label4: TLabel;
    Button5: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Memo1KeyPress(Sender: TObject; var Key: Char);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    hComm : THandle; // Handle für die Schnittstelle
  end;


type
  TCommThread = class(TThread)
  protected
     procedure Execute;override;
  published
     procedure read;
  public
     EventMask : DWord;
     ThComm : THandle;
  end;


var
  Form1     : TForm1;
  o        : TOverlapped;
  ComPort  : PChar; // Name Comport
  CC       : TCommConfig;
  Connect  : Boolean;
  ThreadCom : TCommThread;

implementation

{$R *.dfm}


procedure TCommThread.Execute;

Begin
  Form1.Label4.Caption:='Thread läuft';
  o.hEvent:=CreateEvent(nil,false,false,nil);
  SetCommMask(Form1.hComm,EV_RXCHAR or EV_ERR);
  WaitCommEvent(Form1.hComm,EventMask,@o);
  if (EventMask and EV_RXCHAR = EV_RXCHAR) Then Read;
  if (EVentMask and EV_ERR = EV_ERR) Then Form1.Label3.Caption:='Error';
end;

procedure TCommThread.read;

Var
  P  : Pointer;
  Len : DWord;
  C  : Char;


begin
  Form1.Label4.Caption:='Zeichen Empfangen';
  Form1.Memo2.Lines.Add('Zeichen Empfangen');
end;



procedure TForm1.Button2Click(Sender: TObject);
begin
  ThreadCom.Terminate;
  ThreadCom.WaitFor;
  ThreadCom.Free;
  CloseHandle(hComm);
  Connect:=False;
  Label3.Caption:='ComPort ist geschlossen.';
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  If Connect Then CloseHandle(hComm);
  Close;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if Connect Then CloseHandle(hComm);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  o.hEvent:=CreateEvent(nil,false,false,nil);
  hComm:=CreateFile(ComPort, GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING,
                            FILE_FLAG_OVERLAPPED, 0);
  if hComm <> INVALID_HANDLE_VALUE Then
  Begin
    CC.dwSize:=SizeOf(CC);
    GetDefaultCommConfig(ComPort,CC, CC.dwSize);
    SetCommState(hComm, CC.DCB);
    Connect:=True;
    Label3.Caption:='ComPort ist geöffnet';
    ThreadCom:=TCommThread.Create(True);
    ThreadCom.Resume;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ComPort:='Com1';
  Connect:=False;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  // Com Port Settings
  CC.dwSize:=Sizeof(CC);
  GetDefaultCommConfig(ComPort,CC,CC.dwSize);
  CommConfigDialog(ComPort,Handle,CC);
  SetCommState(hComm,CC.dcb);
end;

procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);

var W : DWord;
    P : Pointer;

begin
  P:=@Key;
  WriteFile(hComm,p^,1,w,@o);
  WaitForSingleObject(o.hEvent,INFINITE);
end;


end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz