|
Registriert seit: 12. Nov 2016 9 Beiträge |
#1
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 16:31 Uhr) Grund: Übersicht verbessert |
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |