| Autor |
Beitrag |
Martello
      
Beiträge: 131
WIN 2000
TP, C, Delphi 1.0, Turbo Delphi 2006, Delphi 7
|
Verfasst: Mi 11.08.10 15:24
Ich habe ein Problem beim Einstieg in UDP mit Narses' udpsocketutil.
Der UDP-Empfang funktioniert makellos, alle 250 ms kommt ein GPS-String via WLAN.
Ich habe eine Variable gps_string:TStringList erzeugt und übergebe den angekommenen UDP-Input via .delemitedText:=...
gps_string.count liefert noch die gültige Anzahl der Elemente zwischen den Kommata.
Aber bereits die Darstellung via
editXYtext:= gps_string[XY] führt zum Absturz wg. "Index größer Maxwert oder so ähnlich".
Hier der Code:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| procedure TForm1.UdpSockUtil1Receive(Sender: TObject); var Len: Integer; Msg: String; vonIP: in_addr;
begin
Len := UdpSockUtil1.ReceiveLength; if (Len > 0) then begin Msg := UdpSockUtil1.ReceiveText(vonIP); Edit1.text:= msg; gps_string.delimitedText:= msg;
i:=gps_string.count;
write(text_file,msg);
Edit2.text:= inttostr(i);
Edit3.text:= gps_string[0]; Edit4.text:= gps_string[1];
end; end; |
Woran könnte es liegen?
Wenn ich die empfangenen Strings in eine Text-Datei schreibe und diese später als Input für meine gps_string:TStingList verwende, dann tritt dieser Fehler nicht auf.
Liegt es vielleicht am ...Receive-Timing?
Grüße,
Martello
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Mi 11.08.10 15:50
Müsste es nicht so sein:
Delphi-Quelltext 1:
| gps_string.strings[0]; | oder der Delimiter stimmt nicht? Was für trennzeichen ist denn z.B. in der MSG drin?
EDIT: Du fragst nach String[1] und hast doch nur einen String wenn ich es richtig sehe!
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Martello 
      
Beiträge: 131
WIN 2000
TP, C, Delphi 1.0, Turbo Delphi 2006, Delphi 7
|
Verfasst: Mi 11.08.10 16:38
ALF hat folgendes geschrieben : | Was für trennzeichen ist denn z.B. in der MSG drin?
EDIT: Du fragst nach String[1] und hast doch nur einen String wenn ich es richtig sehe!
|
In dem empfangenen String ist das Standard-Trennzeichen: ein "Komma".
gps_string ist ein TListString-Element, und durch
gps_string.delimitedText:= msg sortiere ich meinen empfangenen GPS-String in meine gps_string-Liste ein.
Ob ich Edit3.text:= gps_string[0] oder
Edit3.text:= gps_string.strings[0]
verwende ist egal.
Es funktioniert auch problemlos, wenn ich die GPS-Strings aus einer Textdatei einlese, die zuvor mit derselben
procedure TForm1.UdpSockUtil1Receive(Sender: TObject) erzeugt wurden.
Gruß
Martello
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Mi 11.08.10 16:55
Martello hat folgendes geschrieben : | Ob ich Edit3.text:= gps_string[0] oder
Edit3.text:= gps_string.strings[0]
verwende ist egal. |
jo viel mir auch hinterher ein
Martello hat folgendes geschrieben : | Es funktioniert auch problemlos, wenn ich die GPS-Strings aus einer Textdatei einlese, die zuvor mit derselben
procedure TForm1.UdpSockUtil1Receive(Sender: TObject) erzeugt wurden. |
Jo, die liest Du aber mit LoadfromFile ein.
Delphi-Quelltext 1:
| gps_string.delimitedText:= msg; | hier wird aber der gesammte Text in ein Delimiter Zeichen eingepackt! und nicht wie Du es haben möchtest, die einzelnen Wörter oder Sätze getrennt, wenn ich es noch richtig weiss.
DH:
| Zitat: | | Wenn Sie DelimitedText einen Wert zuweisen, müssen die einzelnen Strings zwischen dem in QuoteChar festgelegten Zeichen stehen oder mit dem in Delimiter definierten Trennzeichen voneinander getrennt werden. |
Also kannst Du beim lesen auch nur ein Index haben!?
Ansonsten versuch mal
Delphi-Quelltext 1:
| gps_string.CommaText:= msg |
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Martello 
      
Beiträge: 131
WIN 2000
TP, C, Delphi 1.0, Turbo Delphi 2006, Delphi 7
|
Verfasst: Mi 11.08.10 17:25
ALF hat folgendes geschrieben : | Jo, die liest Du aber mit LoadfromFile ein.
|
Ich lese Zeile für Zeile mit readln(inn_file,zeile) als einzelnen String aus der Text-Datei und weise diese wie folgt zu:
gps_string.delimitedText:= zeile;
Danach stehen alle Elemente einzeln zur Verfügung.
Wenn ich über localhost (also nicht WLAN) aus einer anderen Anwendung kommaseparierte Strings empfange, funktioniert es auch problemlos.
Gruß
Martello
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Mi 11.08.10 17:44
Mh.. muss man da nicht add benutzen um einzelne Strings einzufügen?
Was Du machst ist doch nur ein Überschreiben des aktuellen String!
Ein unterschied zwischen Wlan und Lan dürfte es ja eigentlich nicht geben! Und was passiert wenn Du gps_string.commatext:=msg nimmst!?
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Martello 
      
Beiträge: 131
WIN 2000
TP, C, Delphi 1.0, Turbo Delphi 2006, Delphi 7
|
Verfasst: Mi 11.08.10 18:19
ALF hat folgendes geschrieben : | Und was passiert wenn Du gps_string.commatext:=msg nimmst!?
|
...commatext macht keinen Unterschied..., hab ich probiert....
Gruß
Martello
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Mi 11.08.10 23:20
Hast Du denn mal ein Breakpoint gesetzt an der Stelle(Zeile 14 oben im Code) und Dir die Stringlist mal Anzeigen lassen, ob es so drin steht wie Du es haben möchtest. So Teste ich immer wenn ich nicht weiss warum da nix richtiges ankommt.
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Narses
      

Beiträge: 10184
Erhaltene Danke: 1259
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 11.08.10 23:57
Moin!
Martello hat folgendes geschrieben : | Aber bereits die Darstellung via
editXYtext:= gps_string[XY] führt zum Absturz wg. "Index größer Maxwert oder so ähnlich". |
Du prüfst ja auch nicht, ob überhaupt die nötige Anzahl Elemente in der Stringliste sind
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure TForm1.UdpSockUtil1Receive(Sender: TObject); var Len: Integer; Msg: String; vonIP: in_addr; begin Len := UdpSockUtil1.ReceiveLength; if (Len > 0) then begin Msg := UdpSockUtil1.ReceiveText(vonIP); Edit1.Text := msg; write(text_file,msg); gps_string.delimitedText := msg; i := gps_string.count; Edit2.text := IntToStr(i); if (i > 0) then Edit3.text := gps_string[0]; if (i > 1) then Edit4.text := gps_string[1]; end; end; | Mehr kann ich hier erstmal nicht sehen.  Bei 250ms ist man aber schon nicht mehr in der Lage durch "hinsehen" was brauchbares zu finden. Ansatz: schreib ein Log mit Millisekunden-Bezug, dann kann man mehr sehen.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Martello 
      
Beiträge: 131
WIN 2000
TP, C, Delphi 1.0, Turbo Delphi 2006, Delphi 7
|
Verfasst: Do 12.08.10 10:00
Narses hat folgendes geschrieben : | Mehr kann ich hier erstmal nicht sehen. Bei 250ms ist man aber schon nicht mehr in der Lage durch "hinsehen" was brauchbares zu finden. Ansatz: schreib ein Log mit Millisekunden-Bezug, dann kann man mehr sehen.
|
Hallo,
ich hatte die vorhandenen Leerzeilen aus der mitgeschriebenen Textdatei von Hand gelöscht  Nur deshalb funktionierte es beim Daten-Input aus der leerzeilenfreien Datei
Tatsächlich empfängt die "receive-Methode" zwischendurch offenbar sehr kurze Strings, bzw. werden überzählige CR oder so separat behandelt.
Ich bin sehr froh, einen Schritt weiter zu sein, vielen Dank für Deine Hilfe.
Hinsichtlich systematischen Debuggings habe ich leider auch keine Ahnung
Wie könnte ich denn ein zeitgetaktetes Logging aktivieren?
Gruß,
Martello
|
|
Narses
      

Beiträge: 10184
Erhaltene Danke: 1259
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 12.08.10 11:15
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|