AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Ich bleib im Case hängen

Ein Thema von Daniel B · begonnen am 2. Mär 2003 · letzter Beitrag vom 7. Mär 2003
Antwort Antwort
Seite 2 von 2     12   
Daniel B
(Gast)

n/a Beiträge
 
#11
  Alt 2. Mär 2003, 10:35
Zitat von jbg:
Ändert sich der Wert von ComPort1.InputCount? Wenn ja, was ich annehme, dann solltest du das ganze in eine while-Schleife umwandeln, da bei einer for-Schleife der Ziel-Wert nur einmal ausgewertet wird. Also bei einer Änderung von InputCount iteriert die for-Schleife immernoch bis zum alten Wert, der beim Eintritt in die Schleife von InputCount zurückgeliefert wurde.
Jain, in dem Fall bekomme ich immer zwei Bytes. Und InputCount gibt mir die Anzahl der Bytes im Puffer der Seriellen Schnittstelle. Dadurch lese ich entweder alles was drin ist, oder halt immer zwei Bytes, weil nach meiner Anforderung nur noch zwei zurückkommen. Im prinzip könnte ich es auch fest auf 2 schreiben.
Zitat:
Hast du auch das sCom[2] auskommentiert, oder zumindest auch 2 Zeichen eingelesen?
Ja, bringt aber nichts.

Grüsse, Daniel
  Mit Zitat antworten Zitat
janjan

Registriert seit: 16. Jan 2003
Ort: Bonn ("links über Königswinter ")
240 Beiträge
 
Delphi 4 Standard
 
#12
  Alt 2. Mär 2003, 11:11
benutz doch die Async Kompos, die sind für alles was mit der seriellen Schnittstelle zu tun hat absolut zu empfehlen:
http://sourceforge.net/projects/tpapro/

Da sind zwei Komponenten dabei die dir weiterhelfen sollten, ApdComPort und ApdDataPacket. Das eine ist für die Initialisierung des Com-Ports verantwortlich, das andere lauscht nach bestimmten Paketen.
In deinem Fall bräuchtest du einmal den Comport und zwei Pakete. Bei dem einen Paket stellst du als Anfangsbuchstabe #0 ein und eine Länge von 2 Zeichen, das andere hat den Anfangsbuchstaben #1 und die Länge zwei. Nachdem du den Comport initialisiert hast, lauschen die beiden Paketkompos nach den eingestellten Paketen.
Angenommen es kommt ein #0 und noch ein Zeichen, dann wird ein Event ausgelöst:
Delphi-Quellcode:
procedure TForm1.ApdDataPacket1StringPacket(Sender: TObject; Data: String);
begin

end;
In Data steckt dein Paket drin und du kannst es da weiterbearbeiten.

Probier die Komponenten einfach mal aus, ich bin absolut begeistert
Die Wichtigkeit eines Postings im Forum ist reziprok zur Anzahl der enthaltenenen, kumulierten Ausrufungszeichen!!!
  Mit Zitat antworten Zitat
Daniel B
(Gast)

n/a Beiträge
 
#13
  Alt 2. Mär 2003, 11:18
Hallo janjan,

das kommt nicht in frage. Ich bentuze diese Komponente in zu vielen Programmen. Eine umstellung wäre katastrophal. Ausserdem bin ich auch damit sehr zufrieden. Das Problem was ich jetzt habe liegt ja auch nicht an der Komponenten, sondern an der auswertung der Daten, denk ich.

Grüsse, Daniel
  Mit Zitat antworten Zitat
janjan

Registriert seit: 16. Jan 2003
Ort: Bonn ("links über Königswinter ")
240 Beiträge
 
Delphi 4 Standard
 
#14
  Alt 2. Mär 2003, 11:32
Ich würd eventuell die Zeile
ComPort1.ReadStr(sCom, 1); durch sowas hier ersetzen:
Delphi-Quellcode:
if ComPort1.ReadStr(sCom, 1) = 1 then
  begin
  ...
  end;
Sollte eigentlich auch so klappen, aber wer weiß das schon genau...
Die Wichtigkeit eines Postings im Forum ist reziprok zur Anzahl der enthaltenenen, kumulierten Ausrufungszeichen!!!
  Mit Zitat antworten Zitat
Daniel B
(Gast)

n/a Beiträge
 
#15
  Alt 2. Mär 2003, 11:50
Zitat von janjan:
Ich würd eventuell die Zeile
ComPort1.ReadStr(sCom, 1); durch sowas hier ersetzen:
Delphi-Quellcode:
if ComPort1.ReadStr(sCom, 1) = 1 then
  begin
  ...
  end;
Sollte eigentlich auch so klappen, aber wer weiß das schon genau...
Das würde nichts bringen. Ich sag ja schon sCom, 1! ich lese ein Byte. Und da das Ereigniss, sprich die Prozedur nur ausgelöst wird, wenn was in den Buffer kommt, lese ich somit nur 1 und das immer. Das würde keinen Sinn machen. Ich lese ein Byte, oder gar nichts, in dem Fall wird auch die ganze Prozedur nicht aufgerufen.

Grüsse, Daniel
  Mit Zitat antworten Zitat
janjan

Registriert seit: 16. Jan 2003
Ort: Bonn ("links über Königswinter ")
240 Beiträge
 
Delphi 4 Standard
 
#16
  Alt 2. Mär 2003, 11:54
Schon klar, deswegen ja auch mein:
Zitat von janjan:
Sollte eigentlich auch so klappen, aber wer weiß das schon genau...
Das war das einzige was mir noch zu dem Problem eingefallen ist...
Die Wichtigkeit eines Postings im Forum ist reziprok zur Anzahl der enthaltenenen, kumulierten Ausrufungszeichen!!!
  Mit Zitat antworten Zitat
Daniel B
(Gast)

n/a Beiträge
 
#17
  Alt 2. Mär 2003, 12:10
[quote="janjan"]Schon klar, deswegen ja auch mein: Das war das einzige was mir noch zu dem Problem eingefallen ist.../quote]
Macht ja nichts. War ja gut gemeint. Vielleicht braucht man sowas bei anderen Komponenten, aber nicht bei der TComPort.

Grüsse, Daniel
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#18
  Alt 5. Mär 2003, 10:08
Hi,

ich hab das ganze Posting nur überfolgen, aber ich bin der Meinung, dass
Du folgendes versuchen solltest :

Code:
var
 sCom, sByte: String;
 iFor: Integer;
begin
{ ComPort1.ReadStr(sCom, 2);
 sByte := '';
 Delay;
 sByte := IntToStr(Byte(sCom[2]));
 ShowMessage('Daten: ' + sByte); }
 ComPort1.ReadStr(sCom,ComPort1.InputCount);
 for iFor := 1 to Length(sCom) do
 begin
  sByte := sCom[iFor];
  begin
   case sCom[iFor] of
         #0 : begin
             ShowMessage(IntToStr(Ord(sCom[iFor]))); ***
             //ShowMessage(IntToStr(Ord(sCom[2])));
            end;
         #1 : begin
//             ShowMessage(IntToStr(Ord(sByte)));
//             ShowMessage(IntToStr(Ord(sByte])));
            end;
   end; //case
  end; //begin
 end; //for
end;
Das kann jetzt auch totaler SChwachsinn sein, aber ich weiss ja nicht was Du genau machen willst ?!

Data
  Mit Zitat antworten Zitat
Udo

Registriert seit: 19. Jan 2003
54 Beiträge
 
Delphi 8 Architect
 
#19
  Alt 7. Mär 2003, 21:59
@Daniel

Da folgendes funktioniert:
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var
  sCom: string;
  sByte: Char;
  iFor: Integer;
begin
  sCom := #0#1;
  for iFor := 1 to Length(sCom) do
  begin
    sByte := sCom[iFor];
    begin
      case sCom[iFor] of
        #0:
          begin
            ShowMessage(IntToStr(Ord(sCom[iFor])));
            //ShowMessage(IntToStr(Ord(sCom[2])));
          end;
        #1:
          begin
            ShowMessage(IntToStr(Ord(sByte)));
            // ShowMessage(IntToStr(Ord(sByte])));
          end;
      end;
    end;
  end;
end;
Keine Ahnung ob man Alles auf einmal aus dem Buffer lesen muss aber sByte sollte bestimmt ein Char sein.

Gruss
udo
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 00:52 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