AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Aktuelle Daten der seriellen Schnittstelle anzeigen
Thema durchsuchen
Ansicht
Themen-Optionen

Aktuelle Daten der seriellen Schnittstelle anzeigen

Ein Thema von eticket · begonnen am 1. Sep 2007 · letzter Beitrag vom 3. Sep 2007
Antwort Antwort
Seite 1 von 2  1 2      
eticket

Registriert seit: 30. Aug 2007
17 Beiträge
 
Delphi 5 Enterprise
 
#1

Aktuelle Daten der seriellen Schnittstelle anzeigen

  Alt 1. Sep 2007, 16:21
Hallo

ich habe/suche folgendes
- über die serielle Schnittstelle werden kontinuierlich gleich große Datenpakete empfangen.
- Ich möchte gerne in der Oberfläche einen Start- und Stop-Button
Wenn ich den Start-Button drücke, wird die COM-Schnittstelle geöffnet und die Daten gelesen
Die gelesenen Daten sollen dann kontinuierlich in der Oberfläche angezeigt werden.
Wenn ich den Stop drücke, sollen keine weiteren Daten mehr gelesen werden und die COM-Schnittstelle
wird geschlossen
- Über die COM-Schnittstelle wird bei jedem lesenden Zugriff jeweils eine unterschiedliche Anzahl von
Datenpaketen gelesen

- Es funktioniert bisher
- Oberflächenstruktur
- Einlesen an der Schnittstelle und Aufteilung in die Datenpakete in einem Thread

Was nicht klappt:
Wie kann ich (aus dem Thread heraus) die Oberfläche bei jedem Einlesen aktualisieren?

Viele Dank

Michael
  Mit Zitat antworten Zitat
eisblock

Registriert seit: 11. Dez 2005
Ort: Linderbach
127 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Aktuelle Daten der seriellen Schnittstelle anzeigen

  Alt 1. Sep 2007, 16:47
ich hatte dafür mal ne wunderschöne Komponente, bei der ich mich um nichts weiter kümmern musste.
Hier ist ein Programm, in dem ich die Komponente (deren Namen mir grad entfallen ist =( am besten im Quelltext nachgucken) benutzt habe.

Das Beispielprogramm zeigt kontinuierlich den Datenstrom auf Com1 an. Beenden mit Alt+F4

/Edit: bin mir nicht ganz sicher, ob das das ist was du suchst, aber gucks dir einfach mal an
/Edit2: Wenn ich mich richtig erinnere, waren bei dem Programm die Verbindungsdaten 9600 bit/s, 8 Datenbits, keine Parität, 1 Stoppbit und keine Flusssteuerung, also die Standarddaten von HyperTerminal.

Gruß jr
Angehängte Dateien
Dateityp: rar com_port_lesen_120.rar (315,4 KB, 33x aufgerufen)
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Aktuelle Daten der seriellen Schnittstelle anzeigen

  Alt 1. Sep 2007, 18:06
Hi eticket,

eine entsprechende Komponente heißt CPort. Such mal hier im Forum danach oder bei SourceForge. Wenn du deine Oberfläche aus deinem Thread heraus aktualisieren willst, dann kannst du das auch über ein Ereignis machen. Dieses kannst du in deinem Thread deklarieren und wie ein normales Ereignis mit deinem MainWindow zuweisen.

Delphi-Quellcode:
TMyThread = class(TThread)
...
protected
  procedure DoReceiveData;
...
public
  property ReceiveData : TNotifyEvent read FReceiveData write FReceiveData;
end;

TForm1 = class(TForm)
...
public
  procedure OnReceiveData(Sender : TObject);
end;


procedure TMyThread.DoReceiveData;
begin
  IF Assigned(FReceiveData) then FReceiveData(self);
end;

// Aufruf aus dem Thread wenn Daten empfangen
Syncronize(DoReceiveData);



procedure TForm1.OnReceiveData(Sender : TObject);
var MyThread : TMyThread;
begin
  IF not (Sender is TMyThread) then Exit;
  MyThread := TMyThread(Sender);
  // und auf Daten zugreifen
...
end;
Du kannst natürlich auch eine eigene Procedure of Object definieren in der du die Daten gleich hochreichst.
TReceiveDataEvent = procedure (Sender : TMyThread; Data : String) of Object; Wichtig ist, dass du die Methode zum Absetzen des Ereignisses mit Syncronize aus deinem Thread heraus aufrufst.

Gruß oki
42
  Mit Zitat antworten Zitat
eticket

Registriert seit: 30. Aug 2007
17 Beiträge
 
Delphi 5 Enterprise
 
#4

Re: Aktuelle Daten der seriellen Schnittstelle anzeigen

  Alt 1. Sep 2007, 21:25
Sorry, ich verstehe es nicht.

Anbei die Quellcode-Teile

Delphi-Quellcode:
Thread.pas
...
type
  Messung = class(TThread)
  private
    { Private-Deklarationen }
  protected
    procedure Execute; override;
  public
    ComHandle : THandle;
  end;

...

procedure Messung.Execute;
...
buffer_len:=ReadDataFromCOMPort(ComHandle,buffer);
...
while frames in buffer do
...
   refreshValues(self)   <- Diese Funktion soll im Hauptprogramm die Werte aktualisieren
...

---------------------------------------
unit1.pas:
...
procedure TForm1.StartClick(Sender: TObject);
begin
     ComHandle := 0;
              // Verbindung aufbauen
     ok := ConnectToCOMPort(ComHandle,42, 4);

     if ok = 0 Then
     begin
          Start.Enabled := False;
          Stop.Enabled := True;

              // ErfassungsThread starten
              // Dieser aktualisiert auch die Oberfläche
          DatenerfassungsThread.ComHandle := ComHandle;
          DatenerfassungsThread.Resume;

     end;
              // Verbindung beenden
     ok := DisconnectFromCOMPort(ComHandle);
end;

procedure TForm1.StopClick(Sender: TObject);
begin
     Start.Enabled := True;
     Stop.Enabled := False;
     DatenerfassungsThread.Suspend;
end;

procedure TForm1.RefreshValues(Sender: TObject);
Var j: Integer;
begin
     laenge.Text := IntToStr(buffer_len);
     checksumme.Text := IntToStr(ist_checksumme);
...
end;
In Ergänzung dazu:
Wie kann ich die Daten aus dem Thread an das Hauptprogramm zurückgeben?
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Aktuelle Daten der seriellen Schnittstelle anzeigen

  Alt 2. Sep 2007, 00:55
In etwa so:
Delphi-Quellcode:
Thread.pas
...
type
  TMessung = class(TThread)
  private
    { Private-Deklarationen }
    FRefreshValues : TNotifyEvent;
  protected
    procedure Execute; override;
    procedure DoRefreshValues;
  public
    ComHandle : THandle;
    MeineDatenausMessung : String;
    property RefreshValues : TNotifyEvent read FRefreshValues write FRefreshValue;
  end;

...

procedure TMessung.Execute;
...
buffer_len:=ReadDataFromCOMPort(ComHandle,buffer);
...
while frames in buffer do
...
   Syncronize(DorefreshValues); // Ereignis syncrinisiert aufrufen
...

procedure TMessung.DoRefreshValues;
begin
  IF Assigned(FRefreshValues) then FRefreshValues(self);
end;

---------------------------------------
unit1.pas:
...

TForm1 = class(TForm)
...
public
  procedure OnRefreshValues(Sender : TObject);
....
end;

...
// irgentwo, wo der Thread creiert wird
  Datenerfassung := TMessung.Create(True);
  Datenerfassung.RefreshValues := self.OnRefreshValues;
...

procedure TForm1.StartClick(Sender: TObject);
begin
     ComHandle := 0;
              // Verbindung aufbauen
     ok := ConnectToCOMPort(ComHandle,42, 4);

     if ok = 0 Then
     begin
          Start.Enabled := False;
          Stop.Enabled := True;

              // ErfassungsThread starten
              // Dieser aktualisiert auch die Oberfläche
          DatenerfassungsThread.ComHandle := ComHandle;
          DatenerfassungsThread.Resume;

     end;
              // Verbindung beenden
     ok := DisconnectFromCOMPort(ComHandle);
end;

procedure TForm1.StopClick(Sender: TObject);
begin
     Start.Enabled := True;
     Stop.Enabled := False;
     DatenerfassungsThread.Suspend;
end;

procedure TForm1.RefreshValues(Sender: TObject);
Var Text : String;
begin
  Text := TMessung(Sender).MeineDatenausMessung;

...
end;
Wenn du die Daten direkt hochschicken willst, dann mußt du dir eine eigene Procedure definieren.

Delphi-Quellcode:
Thread.pas
...
type

  TRefreshValues = procedure (Sender : TObject; Daten : String) of Object;

  TMessung = class(TThread)
  private
    { Private-Deklarationen }
    MeineDatenausMessung : String;
    FRefreshValues : TRefreshValues;
  protected
    procedure Execute; override;
    procedure DoRefreshValues;
  public
    ComHandle : THandle;
    property RefreshValues : TRefreshValues read FRefreshValues write FRefreshValue;
  end;

...

procedure TMessung.Execute;
...
buffer_len:=ReadDataFromCOMPort(ComHandle,buffer);
...
while frames in buffer do
...
   Syncronize(DorefreshValues); // Ereignis syncrinisiert aufrufen
...

procedure TMessung.DoRefreshValues;
begin
  IF Assigned(FRefreshValues) then FRefreshValues(self, MeineDatenausMessung);
end;

---------------------------------------
unit1.pas:
...

TForm1 = class(TForm)
...
public
  procedure OnRefreshValues(Sender : TObject; Daten : String);
....
end;

...
// irgentwo, wo der Thread creiert wird
  Datenerfassung := TMessung.Create(True);
  Datenerfassung.RefreshValues := self.OnRefreshValues;
...

procedure TForm1.StartClick(Sender: TObject);
begin
     ComHandle := 0;
              // Verbindung aufbauen
     ok := ConnectToCOMPort(ComHandle,42, 4);

     if ok = 0 Then
     begin
          Start.Enabled := False;
          Stop.Enabled := True;

              // ErfassungsThread starten
              // Dieser aktualisiert auch die Oberfläche
          DatenerfassungsThread.ComHandle := ComHandle;
          DatenerfassungsThread.Resume;

     end;
              // Verbindung beenden
     ok := DisconnectFromCOMPort(ComHandle);
end;

procedure TForm1.StopClick(Sender: TObject);
begin
     Start.Enabled := True;
     Stop.Enabled := False;
     DatenerfassungsThread.Suspend;
end;

procedure TForm1.RefreshValues(Sender: TObject; Daten : String);
Var Text : String;
begin
  Text := Daten;
  // und im Hauptfenster aktualisieren
...
end;
Gruß oki
42
  Mit Zitat antworten Zitat
eticket

Registriert seit: 30. Aug 2007
17 Beiträge
 
Delphi 5 Enterprise
 
#6

Re: Aktuelle Daten der seriellen Schnittstelle anzeigen

  Alt 2. Sep 2007, 09:40
Danke für die Klasse Tipps bisher.

Es funktioniert nun, daß die Daten aus der seriellen Schnittstelle
über den Thread eingelesen werden und über die Prozedur an die
Oberfläche zurück- und ausgegeben werden.

ABER nur der erste Wert. (Beim Debuggen festgestellt, daß Übergabeprozedur
nur 1 aufgerufen wird)

Über die serielle Schnittstelle kommen fortlaufend andere Werte.
Diese Änderungen der Werte dachte ich permanent in der Oberfläche zu
sehen, d.h. hier müßten die Zahlen nur so vorbeifliegen.

Wie erreiche ich das?

Michael
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Aktuelle Daten der seriellen Schnittstelle anzeigen

  Alt 2. Sep 2007, 10:29
Dann stimmt etwas mit dem Auslesen nicht. Da du nur teile deiner Execute-Methode gepostet hast, ist hier nicht zu sehen, wo der Fehler liegt. Mich wundert nur, dass deine ReadDatafromCOMPort-Procedure ausserhalb deiner while-Schleife liegt.
Müsste es nicht so aussehen?
Delphi-Quellcode:
procedure TMessung.Execute;
var Buffer_len : Integer;
begin
  while not terminated do begin
    buffer_len:=ReadDataFromCOMPort(ComHandle,buffer);
    If Buffer_len > 0 then
      // Daten lesen und in meine Daten aus Messung schreiben
...
    If frames in buffer do
       Syncronize(DorefreshValues); // Ereignis syncrinisiert aufrufen
  end;
end;
Gruß oki
42
  Mit Zitat antworten Zitat
eticket

Registriert seit: 30. Aug 2007
17 Beiträge
 
Delphi 5 Enterprise
 
#8

Re: Aktuelle Daten der seriellen Schnittstelle anzeigen

  Alt 2. Sep 2007, 14:51
Asche auf mein Haupt

Die äußere While-Schleife hatte ich kurz rausgenommen und dann wieder vergessen
reinzusetzen.

Jetzt funzt es.

Klasse Support von deiner Seite !!!!!! Echt Spitze !!!!

Michael
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Aktuelle Daten der seriellen Schnittstelle anzeigen

  Alt 2. Sep 2007, 15:40
Hi eticket,

freut mich, dass ich dir helfen konnte. Ich hoffe du bleibst dem Forum treu, ist echt klasse hier und man lernt immer was neues dazu. Von mir auch noch mal nachträglich ein herzliches Willkommen in der DP.

Gruß oki
42
  Mit Zitat antworten Zitat
eticket

Registriert seit: 30. Aug 2007
17 Beiträge
 
Delphi 5 Enterprise
 
#10

Re: Aktuelle Daten der seriellen Schnittstelle anzeigen

  Alt 3. Sep 2007, 14:15
noch ne Ergänzung.

etwas oben steht im Quelltext

procedure TForm1.RefreshValues(Sender: TObject; Daten : String);
Var Text : String;
begin
Text := Daten;
// und im Hauptfenster aktualisieren
...
end;

Das klappt vorzüglich.

Ich habbe allerdings noch eine Checkbox in das Hauptfenster gesetzt.
Wenn diese angekreuzt ist, soll ein weiteres Fenster aufgehen,
in dem nur groß dieser übergebene Text (1 Wert) ganz groß angezeigt wird.

Muß ich hier einen 2. Thread erstellen mit dem Fenster und den Text dann an dieses Fenster übergeben?
Wie mache ich das am geschicktesten?

Michael
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 16:53 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