Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ich bleib im Case hängen (https://www.delphipraxis.net/3226-ich-bleib-im-case-haengen.html)

Daniel B 2. Mär 2003 09:03


Ich bleib im Case hängen
 
Hallo,

Delphi-Quellcode:
var
  sCom, sByte: String;
  iFor: Integer;
begin
 { ComPort1.ReadStr(sCom, 2);
  sByte := '';
  Delay;
  sByte := IntToStr(Byte(sCom[2]));
  ShowMessage('Daten: ' + sByte); }
  for iFor := 1 to ComPort1.InputCount do
  begin
    ComPort1.ReadStr(sCom, 1);
    sByte := '';
    begin
      case sCom[1] of
                  #0 : begin
                         ShowMessage(IntToStr(Ord(sCom[1]))); ***
                         ShowMessage(IntToStr(Ord(sCom[2])));
                       end;
                  #1 : begin
//                         ShowMessage(IntToStr(Ord(sByte)));
//                         ShowMessage(IntToStr(Ord(sByte])));
                       end;
      end; //case
    end; //begin
  end; //for
end;
Mit folgendem Code, lese ich Daten von der Seriellen. Geht auch im Prinzip. Als erstes kommt auch #0, d.h., ich komme auch in die Zeile mit den drei Sternchen, diese wird jedoch nicht mehr ausgeführt. Irgendwie bleibe ich total in der Schleife hängen, mehr passiert nicht, ich kann nur noch das Programm schliessen. Es sieht so aus als wenn ich gar keine Daten erhalten würde. Wenn ich aber Debuge und der Cursor in der Zeile mit *** ist, dann steht in sCom auch #0 drin.

Grüsse, Daniel :hi:

jbg 2. Mär 2003 09:35

Re: Ich bleib im Case hängen
 
Zitat:

Zitat von Daniel B
Wenn ich aber Debuge und der Cursor in der Zeile mit *** ist, dann steht in sCom auch #0 drin.

Kommt nachdem du dann [F8] gedrückt hast die MessageBox?

Daniel B 2. Mär 2003 09:39

Nein, es passiert einfach nichts, egal ob F7 oder F8. Es passiert einfach nichts. Ich kann aber schon noch das Programm normal beenden.

Grüsse, Daniel :hi:

jbg 2. Mär 2003 09:47

Was hast du eigentlich mit sCom[2] vor? Du liest doch nur 1 Zeichen ein, der muss man das ComPort1.ReadStr(sCom, 1); anders verstehen?

Daniel B 2. Mär 2003 09:53

Zitat:

Zitat von jbg
Du liest doch nur 1 Zeichen ein, der muss man das ComPort1.ReadStr(sCom, 1); anders verstehen?

So ist es zu verstehen. Ich habe es auch mal mit 2 versucht, da ich eigentlich zwei Bytes lesen will, das erste Byte ist #0 oder #1 und das zweite ist dann wirklich das was ich brauche., muss es aber anhand vom ersten unterscheiden können.
Wenn #0#32 oder #1#32, dann hat #32 in beiden Fällen andere Bedeutungen für mich. Es ist immer abhängg vom ersten.

Grüsse, Daniel :hi:

jbg 2. Mär 2003 09:55

Ersetze mal ComPort1.InputCount und ComPort1.ReadStr() durch 1 bzw. sCom := #0#32.
Wird die Zeile dann ausgeführt? Wenn ja, dann einzeln die original-Funktionsaufrüfe ausprobieren.

Daniel B 2. Mär 2003 10:00

Zitat:

Zitat von jbg
Ersetze mal ComPort1.InputCount und ComPort1.ReadStr() durch 1 bzw. sCom := #0#32.

Das würde mir nichts bringen, den #32 ist nicht fest, ist ja nur ein Beispiel. Byte1 kann nur #0 oder #1 sein, aber der Wert des zweten Bytes kann zwischen 0 und 255 liegen.

Aber ich kann Dir sagen das der auskommentierte Teil am anfang der Prozedur wunderbar klappt.

Grüsse, Daniel :hi:

jbg 2. Mär 2003 10:11

Zitat:

Zitat von Daniel B
Das würde mir nichts bringen, den #32 ist nicht fest, ist ja nur ein Beispiel.

Und das Ersetzen soll dabei helfen, den Fehler zu finden. Das das Programm dann nichts von der seriellen Schnittstelle liest ist mir klar. Aber zum eingrenzen des Fehlers dient es allemale.


Zitat:

Aber ich kann Dir sagen das der auskommentierte Teil am anfang der Prozedur wunderbar klappt.
In dem rufst du kein ComPort1.InputCount auf. Könnte der Fehler vielleicht dort liegen.

Daniel B 2. Mär 2003 10:19

Hatte es missverstanden.
Also, das scheint nichts zu bringen. Wenn ich das Programm aus Delphi heraus starte und ausprobiere, dann erhalt ich immer eine Access Violation at Adress...
Wenn ich aber nur die exe normal starte, passiert dies nicht, es tut sich aber auch nichts wenn ich die Daten anfordere. Ich kann so oft auf den Empfangen Button klicken wie ich will, es tut sich einfach nichts.

Grüsse, Daniel :hi:

jbg 2. Mär 2003 10:25

Zitat:

Delphi-Quellcode:
for iFor := 1 to ComPort1.InputCount do

Ä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.

Hast du auch das sCom[2] auskommentiert, oder zumindest auch 2 Zeichen eingelesen?

Daniel B 2. Mär 2003 10:35

Zitat:

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 :hi:

janjan 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 :)

Daniel B 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 :hi:

janjan 2. Mär 2003 11:32

Ich würd eventuell die Zeile
Delphi-Quellcode:
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... ;)

Daniel B 2. Mär 2003 11:50

Zitat:

Zitat von janjan
Ich würd eventuell die Zeile
Delphi-Quellcode:
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 :hi:

janjan 2. Mär 2003 11:54

Schon klar, deswegen ja auch mein:
Zitat:

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...

Daniel B 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 :hi:

DataCool 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

Udo 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


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz