AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

(Funktionsschlage?)

Ein Thema von mklenk94 · begonnen am 21. Aug 2013 · letzter Beitrag vom 21. Aug 2013
Antwort Antwort
mklenk94

Registriert seit: 25. Sep 2012
6 Beiträge
 
#1

(Funktionsschlage?)

  Alt 21. Aug 2013, 19:43
Hallo Delphi-Community,

Zuerst mal mein Plan:

mein derzeitiges Projekt beschäftigt sich mit der Kommunikation zwischen einem Mikrokontrollers und dem PC über die serielle Schnittstelle. Senden und empfangen klapp bereits ganz gut. Nun bin ich bei den Interaktionen, die abwechselnd Aktionen von Controller und PC erfordern. Bsp: Register Lesen:
Der PC sendet Zeichen 'l';
PC wartet auf Zeichen '=' vom PC;
PC sendet gewünschte Registeradresse;
PC wartet auf den Wert der Registeradresse;


Nach vielem Gebastle wollte ich eine Ordentliche und Unvierselle Lösung entwickeln.
Mein Plan sieht so aus: Ich habe eine Queue mit Funktionen, die am anfang gefüllt wird. Wird vom PC ein Zeichen empfangen, so wird eine Funktion aus der Queue genommen und mit dem Empfangenen Zeichen als Parameter ausgeführt.

Für das obrige Beispiel sieht das dann so aus:
Ich brauche die Funktion Read(s:string) die das Zeichen mit '=' vergleicht, falls erfolgreich dann die gewünschte
adresse sendet
Und eine 2t. Read(s:string) funktion, die dann irgendwas mit der gelesenen Adresse macht

Eine Initialisierungfunktion fültt die Queue mit den beiden Read funktionen

bei Zeichenempfang wird eine Funktion aus der Queue genommen und mit dem Zeichen als Parameter ausgeführt.

Zusätzlich plane ich noch eine ObjectQueue, in der Objekte, auf die die Funktionen zugreifen können, zu speichern (z.B. label in die Queue, um in der funktion Read ein Label zur ausgabe einzubinden)

somit kann man sich aus relativ wenigen Grundfunktionen (Read,...) verschiedene Aktionen zusammenstellen.

Nun zu Praxis: die Queue Klasse hab ich selbst geschriebe, weil ich nach längerem Suchen keinen Code im Netz gefunden habe, sondern nur Foren-Threads.

hier nun der Relevante Code:

zuerst die Queue unit:
Code:
...
type

  THandleFunction = procedure (s:string)of object;

  TFunctionQueue =class(TObject)
    private
      items: array[1..30] of procedure (s:string)of object;
      s:integer;
    public
      constructor create;
      procedure  get:THandleFunction;
      procedure  enqueue(o:THandleFunction);
  end;

  implementation

constructor TFunctionQueue.create;
begin
  inherited create;
  s:=0;
end;

procedure TFunctionQueue.enqueue(o:THandleFunction);
begin
  if s>30 then
    begin
      s:=s+1;
      items[s]:=o;
    end;
end;

function  TFunctionQueue.get:THandleFunction;
var i:integer;
begin
  if s > 0 then
    begin
      result:=items[1];
      for i:= 1 to s-1 do
        begin
          items[i]:=items[i+1]
        end;
      s:=s-1;
    end
  else result:=nil;
end;
und hier die ausführungs-unit:

Code:

HandleFunctionQueue:TFunctionQueue;

unit AVRManager_U;

interface

uses
  SerialNG, GTypes_U, GManager_U,SysUtils, StdCtrls, Dialogs, Vektor, math;


type

 

  TAvrMan = class(TObject)
    private
     [COLOR="Red"] HandleFunctionQueue:TFunctionQueue;[/COLOR]
//      HandleObjectQueue:TObjectQueue;
      Connected:boolean;
      SerialPort:TSerialPortNG;
      GMan:TGMan;
      ConnectionFlag:boolean;



     

    public
      constructor create(SerialPort0:TSerialPortNG; GMan0:TGMan);
      function Connect:boolean;
      procedure SetPort(b:boolean);

      procedure SendString(s:string);
      procedure HandleInputString(S:string);
      procedure HandleCommandString(s:string; HandleFunction0:THandleFunction);

      function GetConnected:boolean;
      procedure ReadSensor(adr:Word;Edit1,Edit2:TEdit);


      procedure HandleDefault(s:string);
      procedure HandleRead(s:string);
      procedure HandleWrite(s:string);
      procedure HandleRange(s:string);
      procedure HandleHallo(s:string);
      procedure HandleOn(s:string);
  end;








implementation

constructor TAvrMan.create(SerialPort0:TSerialPortNG; GMan0:TGMan);
begin
  SerialPort:=SerialPort0;
  [COLOR="Red"]HandleFunctionQueue:=TFunctionQueue.create;[/COLOR]
//  HandleObjectQueue:=TObjectQueue.create;
  GMan:=GMan0;
  Connected:=SerialPort.Active;
  connect;
  ConnectionFlag:=false;

end;


procedure TAvrMan.SetPort(b:boolean);
begin
  if b = true
  then
    begin
      SerialPort.Active:=true;
      connected:=true;
    end
  else
    begin
      SerialPort.Active:=false;
    end;
end;


function TAvrMan.Connect:boolean;
begin
  SetPort(true);
end;

function TAvrMan.GetConnected:boolean;
begin
  result:=Connected;
end;



procedure TAvrMan.SendString(s:string);
var TempGMode:TGMode;
begin
if Connected = true
then
  begin
    if Length(s) > 0              then SerialPort.SendString(s);
    if GMan.GetGMode.AddTx = true then GMan.AddCommandoTerminalLine('[Sended]: '+s);
  end;
end;


procedure TAvrMan.ReadSensor(adr:Word;Edit1,Edit2:TEdit);
begin



end;


procedure TAvrMan.HandleDefault(s:string);
begin
  GMan.AddCommandoTerminalLine('DefalutHandle:  s='+s);
end;



procedure TAvrMan.HandleRead(s:string);
begin

end;

procedure TAvrMan.HandleWrite(s:string);
begin

end;

procedure TAvrMan.HandleOn(s:string);
begin

end;

procedure TAvrMan.HandleHallo(s:string);
begin

end;

procedure TAvrMan.HandleRange(s:string);
begin

end;



procedure TAvrMan.HandleCommandString(s:string; HandleFunction0:THandleFunction);
begin
  HandleFunction0(s);
end;




procedure TAvrMan.HandleInputString(S : String);
var AddS,showS:String; values1: array[1..13] of integer; i,j,k:integer; values2: array[1..7] of integer; phi:single;
     a,b:TVektor; [COLOR="Red"]NextHandleFunction:THandleFunction;[/COLOR]
begin
  AddS := Copy(S,0,length(S));
  i:=0;
  while (i<=(length(S))) do
    begin
      if (Adds[i]='"') and (Adds[i+1] = '"')
      then
        begin   //   Anfang Command Erkennung
        HandleFunctionQueue.enqueue(nextHandleFunction);
          showS:=Copy(AddS,i+2,Length(AddS));
         [COLOR="Blue"] NextHandleFunction:=HandleFunctionQueue.get;[/COLOR]
         [COLOR="Red"]HandleCommandString(showS,NextHandleFunction);[/COLOR]
        end;    //   Ende  Command Erkennung
      if (Adds[i]='!') and (Adds[i+14]='"')
      then
        begin   //   Anfang Value-Berechnung und GMan.Insert Value
          showS:=Copy(AddS,i+1,13);
          for j:=1 to 13 do
            begin

              values1[j]:=Ord(showS[j]);
            end;
          for j:=1 to 6 do
            begin
              values2[j]:=(((values1[2*j]*4))+((values1[2*j-1]) div 64));
              if (values2[j] >= 513) then begin values2[j]:=-512+(values2[j]-512); end;
            end;
          values2[7]:=values1[13];
        a:=VektorP(values2[1],values2[2],values2[3]);
        b:=VektorP(values2[4],values2[5],values2[6]);

        phi:=RadToDeg(ArcCos(Skalarprodukt(a,b)/(Betrag(a)*Betrag(b))));
        Gman.InsertValue(CreateValue(values2[1],values2[2],values2[3],values2[4],values2[5],values2[6],values2[7],phi));
        i:=i+14;
        end;  //   Ende Value-Berechnung und GMan.Insert Value

      i:=i+1;
    end;
end;


end.
beim Compilieren erhalte ich in der Blauen Zeile den Fehler [Fehler]
in den roten Zeilen gehts um das Problem

-_- anscheinend kann ich Code nicht färben denkt euch einfach das [Color:Red] /[...Blue] als farbig

AVRManager_U.pas(171): Inkompatible Typen: 'procedure, untyped pointer or untyped parameter' und 'THandleFunction'

Für Hilfe schon mal im Vorraus Danke!!

Mfg mklenk
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#2

AW: (Funktionsschlage?)

  Alt 21. Aug 2013, 19:47
Formatierter Source-Code wird nicht blau.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#3

AW: (Funktionsschlage?)

  Alt 21. Aug 2013, 19:55
Moin,

sorry dass ich nicht die Zeit habe den Code zu analysieren. Zuerst solltest Du den Titel berichtigen (Schlange?).
Es gibt ein paar grundsätzliche Dinge zu beachten. Deine ersten Schritte beschreiben den Polling Modus: ich sende eine Anfrage und schließe die mit einem festgelegten Zeichen ab. Danach warte ich, bis die Antwort mit einem festgelegten Zeichen abgeschlossen ist oder ein timeout eintritt.
Dein Queue-Modell weicht scheinbar von der Polling-Hierarchie ab und reagiert auf Events. Da solltest Du genau hinsehen. Bei Sourceforge gibt es die ComPort-Komponente, die alle diese Funktionen abbildet. Wenn Dein Microcontroller Polling unterstützt solltest Du nicht die eventgesteuerten Funktionen darunter mischen.

Grüße, Messie
  Mit Zitat antworten Zitat
mklenk94

Registriert seit: 25. Sep 2012
6 Beiträge
 
#4

AW: (Funktionsschlage?)

  Alt 21. Aug 2013, 20:12
wegen den events/ kommunikation: ich verwende die Komponente SerialNG http://www.domis.de/cms/index.php?mo...u&mid=3&ceid=7

Diese löste beim empfang meherer Zeichen ein sog. ClusterEvent aus, das mit die empfangen Zeichen als string gibt. Den übergebe ich dann. Wenn der string mit "" begint, weiß ich, dass es sich um ein Kommando handelt und es wird verarbeitet. Mein Problem ist eig. nur das speichern und abrufen von mehreren Funktionen, von denen immer eine bestimmte ausgelöst wird, wenn ein Cluster Event ausgelöst wird.

Warum gibt der Compiler den Fehler inkompatible Typen aus? Kann man das beheben? Den Rest hab ich nur zur Vollständigkeit reingestellt.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#5

AW: (Funktionsschlage?)

  Alt 21. Aug 2013, 20:30
Bei Variablen, die Methoden halten, muss man halt aufpassen:

NextHandleFunction:=HandleFunctionQueue.get(); Die runden Klammern sind notwendig, da der Compiler sonst versucht die get-Methode selbst und nicht deren Rückgabewert der Variablen zuzuweisen. Das passt aber nicht zum Typ.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#6

AW: (Funktionsschlage?)

  Alt 21. Aug 2013, 21:30
Nach vielem Gebastle wollte ich eine Ordentliche und Unvierselle Lösung entwickeln.
Dann solltest du dir zuerst ein Daten- bzw. Befehlsprotokoll ausdenken.
Diese Queue brauchst du eigentlich nicht denn der PC kann empfangene Daten/Befehle sofort verarbeiten.
In Senderichtung braucht du eigentlich auch keine Queue; du haust die Daten/Befehle einfach raus und SerialNG besorgt das Zwischenpuffern.

Wie möchtest du denn die Befehle trennen?
Sehr häufig wird z.B. am Ende eines Befehls ein CR-Zeichen (oder CR+LF) geschickt.
fork me on Github
  Mit Zitat antworten Zitat
mklenk94

Registriert seit: 25. Sep 2012
6 Beiträge
 
#7

AW: (Funktionsschlage?)

  Alt 21. Aug 2013, 22:20
der Grundgedanke an.der war folgendes:
man kann eine Adresse vom Controlling lesen und damit verschiedenes auslösen z.B auf label.Schreiben oder Berechnungen anstellen. wenn man das mit zeichen erkennung vom mikrocontr mache Bräuche ich verschiedene Codes je nach Verwendung.der gelesenen.werte auch wenn es sich um die gleichen Variablen im mikrocontr handelt.
danke für.die antworten

das mit den klammern probier ich sobald ich wieder am pc bin (Morgen)
  Mit Zitat antworten Zitat
mklenk94

Registriert seit: 25. Sep 2012
6 Beiträge
 
#8

AW: (Funktionsschlage?)

  Alt 21. Aug 2013, 23:04
ich bitte die Rechtschreibung im oberen Post zu entschuldigen. Es war vom Handy aus und die Autokorrektur mag mich nicht so .

also vielen Dank an Uwe Raabe
mit den klammern lässt sichs compilieren
Testen werd ichs dann morgen.


Ok ist erfolgeich mit dem Mikrokontroller getestet und Problem damit gelöst. Wie kann ich des in den Titel schreiben ( [gelöst] )?

Geändert von mklenk94 (22. Aug 2013 um 16:40 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es 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

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz