![]() |
Ich bleib im Case hängen
Hallo,
Delphi-Quellcode:
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.
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; Grüsse, Daniel :hi: |
Re: Ich bleib im Case hängen
Zitat:
|
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: |
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?
|
Zitat:
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: |
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. |
Zitat:
Aber ich kann Dir sagen das der auskommentierte Teil am anfang der Prozedur wunderbar klappt. Grüsse, Daniel :hi: |
Zitat:
Zitat:
|
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: |
Zitat:
Hast du auch das sCom[2] auskommentiert, oder zumindest auch 2 Zeichen eingelesen? |
Zitat:
Zitat:
Grüsse, Daniel :hi: |
benutz doch die Async Kompos, die sind für alles was mit der seriellen Schnittstelle zu tun hat absolut zu empfehlen:
![]() 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:
In Data steckt dein Paket drin und du kannst es da weiterbearbeiten.
procedure TForm1.ApdDataPacket1StringPacket(Sender: TObject; Data: String);
begin end; Probier die Komponenten einfach mal aus, ich bin absolut begeistert :) |
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: |
Ich würd eventuell die Zeile
Delphi-Quellcode:
durch sowas hier ersetzen:
ComPort1.ReadStr(sCom, 1);
Delphi-Quellcode:
Sollte eigentlich auch so klappen, aber wer weiß das schon genau... ;)
if ComPort1.ReadStr(sCom, 1) = 1 then
begin ... end; |
Zitat:
Grüsse, Daniel :hi: |
Schon klar, deswegen ja auch mein:
Zitat:
|
[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: |
Hi,
ich hab das ganze Posting nur überfolgen, aber ich bin der Meinung, dass Du folgendes versuchen solltest :
Code:
Das kann jetzt auch totaler SChwachsinn sein, aber ich weiss ja nicht was Du genau machen willst ?!
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; Data |
@Daniel
Da folgendes funktioniert:
Delphi-Quellcode:
Keine Ahnung ob man Alles auf einmal aus dem Buffer lesen muss aber sByte sollte bestimmt ein Char sein.
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; 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