![]() |
(Funktionsschlage?)
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:
und hier die ausführungs-unit:
...
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;
Code:
beim Compilieren erhalte ich in der Blauen Zeile den Fehler [Fehler] 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. in den roten Zeilen gehts um das Problem -_- anscheinend kann ich Code nicht färben denkt euch einfach das [Color:Red] /[...Blue] als farbig :D AVRManager_U.pas(171): Inkompatible Typen: 'procedure, untyped pointer or untyped parameter' und 'THandleFunction' Für Hilfe schon mal im Vorraus Danke!! Mfg mklenk |
AW: (Funktionsschlage?)
Formatierter Source-Code wird nicht blau.
|
AW: (Funktionsschlage?)
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 |
AW: (Funktionsschlage?)
wegen den events/ kommunikation: ich verwende die Komponente SerialNG
![]() 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. |
AW: (Funktionsschlage?)
Bei Variablen, die Methoden halten, muss man halt aufpassen:
Delphi-Quellcode:
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.
NextHandleFunction:=HandleFunctionQueue.get();
|
AW: (Funktionsschlage?)
Zitat:
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. |
AW: (Funktionsschlage?)
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) |
AW: (Funktionsschlage?)
ich bitte die Rechtschreibung im oberen Post zu entschuldigen. Es war vom Handy aus und die Autokorrektur mag mich nicht so :D.
also vielen Dank an Uwe Raabe mit den klammern lässt sichs compilieren :D 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] )? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:59 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 by Thomas Breitkreuz