auf Event warten

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
jornbyte
Beiträge: 36
Registriert: Di 14. Nov 2006, 10:15
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Hohenstein - Er.

auf Event warten

Beitrag von jornbyte »

Hallo

Hab wiedermal ne Frage.
An die serielle Schnitstelle wird ein String gesendet, klappt gut. Nun könnte es auf den String (je nach Inhalt) eine Antwort geben. Wie kann ich dieses Ereigniss mitbekommen ohne Pollen. Synaser bietet OnStatus an, nur da kommt nix an. Ich denk das ich wiedermal zu dumm bin. Wer kann mir helfen?
mfg Jornbyte
http://forum.electronicwerkstatt.de/phpBB/" onclick="window.open(this.href);return false;

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Gar nich.

Synapse ist nicht asynchron weder bei Seriell noch bei TCP/IP also wirst du schon nen thread drumrumbaun müssen.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

jornbyte
Beiträge: 36
Registriert: Di 14. Nov 2006, 10:15
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Hohenstein - Er.

Beitrag von jornbyte »

Ich habs geahnt
Danke
mfg Jornbyte
http://forum.electronicwerkstatt.de/phpBB/" onclick="window.open(this.href);return false;

starkard
Beiträge: 87
Registriert: Mi 31. Okt 2007, 10:44

Synaser

Beitrag von starkard »

Hallo Leute,

Habe ein ähnliches Problem wie jornbyte. Ich vermisse bei Synaser ein Ereignis/Interrupt um sofort zu merken wann etwas auf meiner schnittstelle angekommen ist. Gibts es soetwas schon? Was meinst du mit "Threads"? Meine Idee: Man könnte z.B. einen Timer bauen der alle 10-100ms nach CanRead fragt, möchte aber wenn möglich soetwas vermeiden. Thx

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Ein Thread ist ein separater Prozess, der kann ständig nachschaun ob etwas auf der Schnittstelle angekommen ist und ein Ereignis auslösen wenn etwas da ist.

Lest euch mal in Threads ein.
Ich hab mal ne kleine Unit angehängt die euch ne TComport Klasse bereitstellt die sowas tut.
Dateianhänge
ucomport.pas
(9.68 KiB) 146-mal heruntergeladen
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

starkard
Beiträge: 87
Registriert: Mi 31. Okt 2007, 10:44

Beitrag von starkard »

Hallo nochmal,

Erstmal danke für die schnelle Antwort. Diese unit scheint genau das zu sein wonach ich gesucht habe. Habe diese auch in mein Projekt aufgenommen, schaffe es aber nicht das Event abzufangen. Könntest du mir sagen wie es heisst bzw. wie ich es aufrufen kann. Meine Vermutung: OnCharRecived oder OnLineRecived!?

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Was gibts daran denn misszuverstehn ?
OnCharrecived wird bei jedem empfangenen Buchstaben aufgerufen und OnLineRecived bei jeder Zeile die durch einen bestimmten Caracter abgeschlossen wurde per default #13.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

starkard
Beiträge: 87
Registriert: Mi 31. Okt 2007, 10:44

Beitrag von starkard »

Sry, ich hab mich wieder missverständlich ausgedrückt. Zumal bin ich Anfänger und habe deshalb nicht verstanden wie in meiner unit die procedur für das Ereignis deklariert werden muss. Habe in den uses synaser und die ucomport aufgenommen. Habe unter anderem folgendermassen ausprobiert, was natürlich nicht so funzt(omg):

procedure TComPort.OnCharRecived();
begin
end;

Zumal die ucomport 2 Klassen bereitstellt: TRecvThread & TComport.
Wäre nett wenn du mir einen Tip geben könntest.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

TComport.OnLineRecived := < Da drückst du Strg+Umschalt+C

TComport musst natürlich nehmen. TRecvThread ist ne interne Klasse. Das sollte aber aus dem Code gut ersichtlich sein.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

starkard
Beiträge: 87
Registriert: Mi 31. Okt 2007, 10:44

Beitrag von starkard »

Ich weiss jetzt wird langsam lästig und nervig aber ich brauche unbedingt dieses Event. Hab die Ratschläge soweit befolgt, komme trozdem nicht weiter. Habe ucomport in mein Projektverzeichniss und in mein Projekt aufgenommen und unter uses mit aufgeführt. Soweit sogut. Möchte jetzt in einer unit auf das Event OnLineRecived zugreifen.

Code: Alles auswählen

ser: TComport;
 
procedure TForm3.FormShow(Sender: TObject);
begin
     ser.OnLineRecived:=@Form3LineRecived;
end;    
 
procedure TForm3.serLineRecived(Port: TComport; line: string);
begin
end;
Bekomme immer die Fehlermeldung: "Projekt raised exception class 'External: SIGSEGV' HILFE :cry:

Benutzeravatar
theo
Beiträge: 10859
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Ahem, Ich habe von TComport zwar keine Ahnung, aber dein Code Schnipsel sieht sehr seltsam aus. Kompiliert das überhaupt?
Wie hast du denn "Form3LineRecived" deklariert? Ich sehe nur eine methode "serLineRecived". Wird "ser" überhaupt created?

P.S: Man schreibt eigentlich "received" nicht "recived"

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Ich hätt den code nicht posten dürfen. Bereu das schon weider zutiefst. Genau deshalb gibt es wenig Open Source Software von mir.

Starkard dieses Forum hier ist nicht dazu da um Leuten beizubringen wie sie Pascal lernen können. Sondern um Leuten bei problemen mit Pascal und Lazarus zu helfen. Allein das es jemandem Ohne Pascal Kentnisse Möglich ist soweit wie du zu kommen ist ein riesiger Beweis für die Tauglichkeit der Sprache und Lazarus.

Du findest im Internet Hunderte pascal Tuturials, Beschreibungen der Seriellen Schnittstelle u.s.w. Ich hab den Code als referenz gepostet und nicht damit ich dir erklären muss wie du eine Zeile Code in Pascal schreibst.

Bei Aussagen wie Hilfe ich bekomme eine Fehlermeldung SIGDEV stellen sich mir immer wieder die Nackenhaare auf. So etwas kann von Benutzern kommen aber nicht von Programmierern.

Arbeite bitte zuerst mal ein Pascal Tuturial DURCH bevor du versuchst zu programmieren ohne zu wissen was du da tust. Und dann lern den Debugger zu neutzen um deine Fehler zu finden.

@Theo, das recived ist warscheinlich n Tippfehler von mir und Lazarus hat den beim erzeugen des Ereignisses natürlich mit übernommen.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
theo
Beiträge: 10859
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Christian hat geschrieben: Arbeite bitte zuerst mal ein Pascal Tuturial DURCH bevor du versuchst zu programmieren ohne zu wissen was du da tust. Und dann lern den Debugger zu neutzen um deine Fehler zu finden.
Das hier scheint ganz gut:
http://www.delphi-treff.de/tutorials/ei ... rs/page/8/" onclick="window.open(this.href);return false;
Dort steht auch was zu "Ereignisse". Das meiste gilt auch für Lazarus.
Das @ Zeichen brauchst du aber im objfpc mode. (Sonst {$mode delphi} )
Christian hat geschrieben: @Theo, das recived ist warscheinlich n Tippfehler von mir
Wenn wir schon dabei sind: "Tutorial" nicht "Tuturial" ;-)

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Ups ... ;)
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

starkard
Beiträge: 87
Registriert: Mi 31. Okt 2007, 10:44

Beitrag von starkard »

Hallo,

Ich habe mir mal wieder die ucomport angeschaut, und muss
nochmals eine Frage stellen. Erwarte keine Antwort, wäre aber sehr dankbar.

Es scheitert an der Stelle des Threaderstellens. Habe es aus Testgründen bei der Defaultinitialisierung belassen und möchte einfach die Schnittstelle öffnen:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
     seri:=TComPort.Create('COM1');
     seri.Open;
end;
 
//--------
 
constructor TRecvThread.Create(Port : TComPort);
begin
  FPort := Port;
  FBuffer := '';
  inherited Create(False); // <-- NOTHREADERROR
end;
Warum bekomme ich an dieser Stelle diesen Fehler, obwohl ich ein TComportobjekt erzeugt habe? Danke

Antworten