|
Registriert seit: 25. Sep 2012 6 Beiträge |
#1
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 ![]() AVRManager_U.pas(171): Inkompatible Typen: 'procedure, untyped pointer or untyped parameter' und 'THandleFunction' Für Hilfe schon mal im Vorraus Danke!! Mfg mklenk |
![]() |
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 |
![]() |
![]() |