Einzelnen Beitrag anzeigen

2Knuckels

Registriert seit: 12. Nov 2016
9 Beiträge
 
#1

Event Handler für Unit erstellen

  Alt 12. Nov 2016, 16:16
Delphi-Version: 10 Seattle
Aufgabenstellung
Ein Objekt aus einer Biblothek zur Bedienung des COM ports während der Laufzeit verwenden. (TMSAsync Comport bib).
Die eigne Unit LIBcom erstellt während der Laufzeit einen COM port und führt nach dem Aufruf eine Poll Abfrage am COM POrt durch.

Das ganze funktioniert auch, aber es soll ein Event Handler benutzt werden um dem Programm mitzuteilen, dass am COM Eingang Daten anliegen.
(Der Event Handler an sich funktioniert, wenn man das COM Port Objekt graphisch auf dem App Form anlegt)
Wenn der Event Handler durch das während der Runtime erzeugte Objekt angesprochen wird, reagiert er nicht.

Wo ist da der Fehler? Delphi 10.1 compiliert ohne Fehler

Code:
unit LIBcom;
interface
//**** LIB USES ****************************************************************
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs,Vcl.StdCtrls,
  Vacomm, VaClasses;

//**** GLOBAL CLASSES **********************************************************
type TCOMForm = class(TForm)                                                  // CLASS form
  procedure VaComm1RxFlag(Sender: TObject);                                    // CLASS procedure for RXflag event
  procedure VaComm1RxChar(Sender: TObject; Count: Integer);                    // CLASS procedure for RXChar event
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

//**** LIB FUNCTIONS ***********************************************************

function COMpolldata(SetPortNum:byte):string;                                  // COM - Poll data return RX as string (termination deleted)

//**** LIB GLOBAL CONSTANTS ****************************************************

//**** LIB GLOBAL VARIABLES ****************************************************
var  COMForm: TCOMForm;                                                       // COM - referenz auf das Form des COM Ports
      VaComm1: TVaComm;                                                        // COM - referenz auf den com port direkt


      implementation
//**** LIB LOCAL USES **********************************************************
uses AppMain;

//**** LIB LOCAL CONSTANTS *****************************************************


//**** LIB LOCAL VARIABLES *****************************************************
var    TXTerm:string;                                                         // COM - Character for termination (carrige return)
        RXTerm:string;                                                         // COM - Character for termination (carrige return)
        COMtimeout:word;                                                       // COM - Timeout time in [ms] for RX data

//******************************************************************************
//**** LIB CODE START **********************************************************
//******************************************************************************

//**** COM TX RX FUNCTIONS *****************************************************
//** COM - tx data (-> string OK, ER)
function COMtxdata(txdata:string):string;
begin
  if ((VaComm1.Active=true) and (VaComm1.PortNum > 0)) then begin              // CHECK if com availible
      txdata:=txdata + TXTerm;                                                 // ADD Terminierung
      VaComm1.WriteText(AnsiString(txdata));                                               // TX string
      result:='OK';                                                            // SET result OK
  end else result:='ER';                                                       // SET result error no com port
end;

//** COM - rx data LOOP (-> rxstring, ER)                     <-------------- klassische Abfrage die auch funktioniert
function COMrxdataLoop():string;
var  Tick: DWord;                                                             // VAR loc timer [ms]
      Stat: Byte;                                                              // VAR loc status loop 0:running 1:string complete 2:timeout
      RChr: Ansichar;                                                          // VAR loc to collect char from com buffer
begin
  if ((VaComm1.Active=true) and (VaComm1.PortNum > 0)) then begin              // CHECK if com availible
      Tick := GetTickCount + COMtimeout;                                       // GET actual system tick (ms) + Timeout
      Stat:=0;                                                                 // SET stat on initial 0
      result:='';                                                              // CLEAR result var
      while (Stat = 0) do begin
        if (GetTickCount > Tick) then Stat:=2;                                 // SET exit loop status on timeout
        if (VaComm1.ReadBufUsed > 0) then begin                                // CHECK if COM port buffer is filled
          VaComm1.ReadChar(RChr);                                              // READ a char from buffer
          result:=result + Char(RChr);                                         // ADD char from buffer to result
        end;
        if (length(result) > 0) then begin                                     // CHECK length of result
          if (result[length(result)] = RXTerm[1]) then Stat:=1;                // SET exit loop on string received (using termination)
        end;
      end;
      if (Stat = 2) then result:='ER';                                         // SET result on Timeout
  end else result:='ER';                                                       // SET result error no com port
end;

//** COM - rx data EVENT term flag
 procedure TCOMForm.VaComm1RxFlag(Sender: TObject);
 begin
    Form1.Label1.Caption:=Form1.Label1.Caption + ' - Hello FLAG';              // DUMMY CODE  <------ Event der nicht funktioniert
 end;

 //** COM - rx data EVENT term char
procedure TCOMForm.VaComm1RxChar(Sender: TObject; Count: Integer);
begin
    Form1.Label1.Caption:=Form1.Label1.Caption + ' - Hello CHAR';              // DUMMY CODE  <------ Event der nicht funktioniert (selbes problem wie oben)
end;

//**** COM FUNCTIONS ***********************************************************
//** COM - init port
procedure COMinitport(SetPortNum:byte);
begin
   VaComm1:=TVaComm.Create(COMForm);                                           // CREATE com port
   VaComm1.PortNum:=SetPortNum;                                                // SET port number (as port is not open)
   VaComm1.Baudrate:=br57600;                                                  // SET Boud Rate = 57600
   VaComm1.Databits:=db8;                                                      // SET Data Bits = 8
   VaComm1.Stopbits:=sb1;                                                      // SET Stop Bits = 1
   VaComm1.Parity:=paNone;                                                     // SET Set Parity = None
   VaComm1.EventChars.EventChar:=#13;                                          // SET ENABLE RX flag ***** ENABLE VACOMM.MonitorEvents ceRXFlag in Propreties ****** ( in VaComm file add 2x [ceError, ceRxChar, ceRxFlag, ceTxEmpty])
   VaComm1.MonitorEvents:=[ceError, ceRxChar, ceRxFlag, ceTxEmpty];            // SET ENABLE cdRXFlag
   TXterm:=#13;                                                                // SET Character for termination (carrige return)
   RXterm:=#13;                                                                // SET Character for termination (carrige return)
   COMtimeout:=500;                                                            // SET Timeout time in [ms]
end;

//** COM - open port (use com port on given form)
procedure COMopen();
begin
   VaComm1.Open;                                                               // OPEN com port
   VaComm1.WriteText(AnsiString(TXterm));                                      // TX termination to clear all slaves
   APPDelay(200);                                                              // DELAY
   VaComm1.PurgeReadWrite;                                                     // CLEAR i/o port (for all slaves)
end;

//** COM - close port
procedure COMclose();
begin
    if (VaComm1.Active=true) then VaComm1.Close;                               // CLOSE com port if open
end;


//**** COM OPERATION ***********************************************************
//** COM - poll data
function COMpolldata(SetPortNum:byte):string;
begin
   COMinitport(SetPortNum);                                                    // SET comport setup
   COMopen();
   COMtxdata('M1');                                                            // TX << M1 >>
   //Form1.Label1.Caption:=COMrxdataLoop;                                        // READ read buffer (so funktioniert die POLL abfrage)
   if (VaComm1.Active=true) then VaComm1.Close;                                // CLOSE com port if open
end;

end.

IM graphischen Form1
wird das ganze dann einfach so aufgerufen:

COMpolldata(4); // Aufruf der Prozedrure mit COM POrt Num = 4



Wenn einer eine Idee hat woran es liegt wäre super.

Geändert von 2Knuckels (12. Nov 2016 um 17:31 Uhr) Grund: Übersicht verbessert
  Mit Zitat antworten Zitat