AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein lesen von RS232 / TComPortLib / Delphi6
Thema durchsuchen
Ansicht
Themen-Optionen

lesen von RS232 / TComPortLib / Delphi6

Ein Thema von temi · begonnen am 1. Dez 2014 · letzter Beitrag vom 2. Dez 2014
Antwort Antwort
temi

Registriert seit: 6. Apr 2013
9 Beiträge
 
#1

lesen von RS232 / TComPortLib / Delphi6

  Alt 1. Dez 2014, 16:59
Hallo Forum,

ich muß hier die Gewichte von einer Waage übertragen. Also an der Waage kann man mit Print das aktuelle Gewicht auf eine RS232-Schnittstelle ausgeben.

Ich hab mir die ComPort Library version 4.10 installiert.

und kann auch was empfangen. Leider nur einmal dann geht's nicht mehr.

OK also die Komponente hat einen RxChar Event dort lese ich

Delphi-Quellcode:

procedure TfrmKaeseSchneiden.ComPort1RxChar(Sender: TObject; Count: Integer);
var
   gewicht, gram: String;
   gramm: Currency;
begin
     sleep(2000);
     ComPort1.ReadStr(gewicht, Count);

     ShowMessage(gewicht);

     // Weitere Verarbeitungschritte .....
end;
Frage ist warum erhalte ich nur einmal einen Wert von der Schnittstelle. Ich schätze mal ich könnte die serielle Schnittstelle nach jedem Wert kurz schließen und dann wieder öffnen. Denke aber das ist nicht so gedacht
Wie macht man es richtig?


Gruß
Temi
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: lesen von RS232 / TComPortLib / Delphi6

  Alt 1. Dez 2014, 17:23
Wozu das Sleep?

Hast du mal um deinen Code ein Try-Except drumrumgemacht, inkl. Fehlerausgabe?
Wenn da eine Exception auftritt, dann wird diese nicht angezeigt, sondern in den TComPort-Lese-TThread weitergeleitet.
Der Thread wird dadurch beendet und das war's dann.

Auch mußt du aufpassen, ob OnRxChar im Hauptthread läuft (weiß das grade nicht) und wenn nicht, dann darf dort nich auf die VCL zugegriffen werden.

Außerdem, wenn du OnRxChar benutzt, dann mußt du selber sicherstellen, daß die Daten "komplett" sind und den unvollständigen Teil selber zwischenspeichern, bzw. auch zuviele Daten (vom nächsten Datenpacket).
Oder du benutzt TComDataPacket.OnPacket, welches für dich das Cachen und Zerlegen übernimmt.
$2B or not $2B

Geändert von himitsu ( 1. Dez 2014 um 17:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: lesen von RS232 / TComPortLib / Delphi6

  Alt 1. Dez 2014, 17:38
Könnte es sein, daß die gelesenen Daten quittiert werden müssen?
Ohne quittung ist mit dem Senden Schluß?

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#4

AW: lesen von RS232 / TComPortLib / Delphi6

  Alt 1. Dez 2014, 18:08
Ist Jahrzehnte her bei mir, damals musste man mit der Waage vereinbaren, wie Meßwerte übertragen werden. Also z.B. kontinuierlich (man wird mit Meßwerten erschlagen) oder Peakgewicht, Null usw. musste man dann selber bestimmen oder die Waage schickt nur stabile Meßwerte.
Dann die Frage, wie die Werte übernommen werden. Ist da eine Art CR/LF implementiert ähnlich Read/Readln, was ist das Zeilenendezeichen, usw usw.
Ich würde mal die Doku der Waage fragen.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: lesen von RS232 / TComPortLib / Delphi6

  Alt 2. Dez 2014, 07:26
Meine Routine zum Waage auslesen sieht an der Stelle so aus:

Delphi-Quellcode:
var
  sReceive : String;

procedure TfmMeasU.ComPort1RxChar(Sender: TObject; Count: Integer);
var
  r_buff : array[0..2048] of char;
  i,p : Integer;

begin
  ComPort1.Read(r_buff,SizeOf(r_buff));
  for i := 1 to Count do
  begin
    if r_Buff[i-1] > #13 then
    begin
      sReceive := sReceive + r_Buff[i-1];
    end else
    begin
      if r_Buff[i-1] = #13 then
      begin
        Showmessage('Gewicht : ' + sReceive);
        sReceive := '';
      end;
    end;
  end;
end;
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
temi

Registriert seit: 6. Apr 2013
9 Beiträge
 
#6

AW: lesen von RS232 / TComPortLib / Delphi6

  Alt 2. Dez 2014, 08:12
Hallo himitsu

Ohne das Sleep bekomme ich nicht alle Zeichen. Ich denke das der Event beim Empfang des ersten Zeichen aufgerufen wird und Ich erst warten muß bis alle Zeichen im Buffer sind.

Jedenfalls ohne Sleep funktionierts nicht die 2000 hab ich im try and error "ermittelt"

nein try - except hab ich noch nicht versucht. Dachte eigentlich die IDE zeigt mir immer alle Fehler an aber mit threads kenn ich mich nicht aus muss ich gestehen

Kannst Du mir mal ein Beispiel mit TComDataPacket.OnPacket zeigen? Dachte eigentlich mit RxChar und ReadStr hab ich die einfachte Variante erwischt. Selbiger Quellcode funktioniert nämlich mit einer anderen Waage.

Gruß
temi
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: lesen von RS232 / TComPortLib / Delphi6

  Alt 2. Dez 2014, 09:08
IDE Debugger zeigt Exceptions an: Das klappt nicht immer.

Sleep: Diese Antwort/Lösung kann so nicht stimmen funktionieren, denn egal ob zwischendrin noch was reinkäme ... du liest dennoch nur das aus, was bei Funktionseintritt da war, weil
ComPort1RxChar(Sender: TObject; Count: Integer); . --> . sleep(2000);. --> . ComPort1.ReadStr(gewicht, Count);

siehe baumina (OK, die zeichenweise Behandlung könnte man auch besser erledigen) oder TComDataPacket (mit Ende-Code = #13)
$2B or not $2B

Geändert von himitsu ( 2. Dez 2014 um 09:12 Uhr)
  Mit Zitat antworten Zitat
temi

Registriert seit: 6. Apr 2013
9 Beiträge
 
#8

AW: lesen von RS232 / TComPortLib / Delphi6

  Alt 2. Dez 2014, 13:13
Hallo Danke an alle ich hab's jetzt

Ja himitsu das mit dem sleep is völliger Quatsch - hab mir da so'ne komische Erklärung zusammengebastelt, weil ich immer unterschiedliche Stringlängen in meiner Variablen hatte.

Mein Fehler das ich aus was für Gründen auch immer mir vorgestellt habe die Schnittstelle übergibt mir immer meinen fertigen String. Also mit einem Event immer der komplette String dabei ist das so das der unter umständen mehrmals aufgerufen wird und ich mir meinen kompletten String zusammenbasteln muß

bin jetzt aus diesen Gründen doch auf ComDataPacket umgestiegen und wieder 'n bischen schlauer

Danke nochmal an alle

Gruß
temi
  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 22:54 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