![]() |
Delphi-Version: 7
Abfrage des Seriellen Ports liefert nur Mist
Hallo!
Ich habe vor Jahren mich mit Delphi in der Schule beschäftigt. Bin leider mittlerweile leicht aus der Übung. Nichts destotrotz soll ich ein Projekt umsetzen. Es sollen Daten an die Serielle Schnittstelle geschrieben und auch ausgelesen werden. Damit soll man ein Netzteil einstellen können. Die Schnittstellenparameter vom Netzteil sind: Baudrate: 57600 baud Datenbits: 8 Parity: keine Protokoll: <STX>/<ETX> Mit meinem Code kommt nur unverständliche Zeichen zurück (Rot ist der gesendete Befehl): OUT:UOUTS??t?ÝÀý OUT:UOUTS??@õÁð Prinzibiell scheint der Code OK zu sein. Wenn ich ein embeded System (Soekris) anschließe kommen lesbare Zeichen zurück. Hier nun der Code
Delphi-Quellcode:
Bitte bitte helft mir!
procedure TMainForm.cpDrvReceiveData(Sender: TObject; DataPtr: Pointer;
DataSize: Cardinal); var iLastLine, i: integer; s, ss: string; begin // Convert incoming data into a string s := StringOfChar( ' ', DataSize ); move( DataPtr^, pchar(s)^, DataSize ); // Exit if s is empty. This usually occurs when one or more NULL characters // (chr(0)) are received. while pos( #0, s ) > 0 do delete( s, pos( #0, s ), 1 ); if s = '' then exit; // Remove line feeds i := pos( #10, s ); while i <> 0 do begin delete( s, i, 1 ); i := pos( #10, s ); end; // Don't redraw the rich edit control until we finished updating it //IncomingRichEdit.Lines.BeginUpdate; // Get last line index iLastLine := Console.ConsoleOutput.Lines.Count-1; // If the rich edit is empty... if iLastLine = -1 then begin // Remove line feeds from the string i := pos( #10, s ); while i <> 0 do begin delete( s, i, 1 ); i := pos( #10, s ); end; // Remove carriage returns from the string (break lines) i := pos( #13, s ); while i <> 0 do begin ss := copy( s, 1, i-1 ); delete( s, 1, i ); Console.ConsoleOutput.Lines.Append( ss ); i := pos( #13, s ); end; Console.ConsoleOutput.Lines.Append( s ); end else begin // String to add is : last line added + new one s := Console.ConsoleOutput.Lines[iLastLine] + s; // Remove carriage returns (break lines) i := pos( #13, s ); while i <> 0 do begin ss := copy( s, 1, i-1 ); delete( s, 1, i ); if iLastLine <> -1 then begin Console.ConsoleOutput.Lines[iLastLine] := ss; iLastLine := -1; end else Console.ConsoleOutput.Lines.Append( ss ); i := pos( #13, s ); end; if iLastLine <> -1 then Console.ConsoleOutput.Lines[iLastLine] := s else Console.ConsoleOutput.Lines.Append( s ); end; //IncomingRichEdit.Lines.EndUpdate; // Scroll incoming text rich edit SendMessage( Console.ConsoleOutput.Handle, EM_SCROLLCARET, 0, 0 ); end; Grüße! |
AW: Abfrage des Seriellen Ports liefert nur Mist
Hm... Ich würde behaupten, dass du einfach das EOL (End Of Line) löschst, was natürlich schlecht ist. Es kommt quasi immer ein String fester Länge bei die an und du musst feststellen, wo das Ende des Strings ist. Da kommt auch dein Datenmüll nach dem Befehl her. Wenn der gesendete String kürzer als die Standardlänge ist, wird dieser eben mit einem EOL-Zeichen versehen und der Rest wird durch irgendwas augefüllt. Das EOL müsste eigentlich *immer* im String vorhanden sein, meist ist es #0, #10 oder #13. Das hängt vom Protokoll ab. Näheres kann ich dazu aber nicht sagen, da ich das letzte Mal vor x Jahren mit dem COM-Port zu tun hatte.
|
AW: Abfrage des Seriellen Ports liefert nur Mist
Hallo Armin,
danke für deine schnelle Antwort um die Uhrzeit :) Muss zugeben dass ich den Code "geklaut" habe... Wie gesagt kenne ich mich kaum noch mit Delphi aus :( Von daher verstehe ich im Moment noch nicht was der Code genau macht. Aber ich glaube du hast da auch was falsch verstanden. Nochmal hierzu: OUT:UOUTS??t?ÝÀý OUT:UOUTS??@õÁð Das "OUT:UOUTS?" gebe ich im Klartext auf der Konsole (RichText) aus. Dies ist ja der Befehl der eigentlich gesendet werden soll. Zurück kommt: ?t?ÝÀý ?@õÁð Trotzdem erstmal danke für deine Antwort! Grüße |
AW: Abfrage des Seriellen Ports liefert nur Mist
Mich für sieht das Ganze wie ein AnsiChar/WideChar-Problem aus.
Ehrlich gesagt habe ich keine Ahnung von Seriellen Ports, aber als ich meine Projekte von Delphi7 auf D2009 umstellt habe sind mir solchen "Hyroglyphen" des öfteren untergekommen. Versuch doch mal die Variablen s,ss auf WideString zu deklarieren(mit den verbundenen Folgen für den restlichen Code). Die Function
Delphi-Quellcode:
liefert schließlich nur einen Pointer auf eine gewisse Anzahl von Bytes. Wer sagt dir, dass die gelieferten Daten AnsiStrings (Delphi7!) sind!?
cpDrvReceiveData(Sender: TObject; DataPtr: Pointer;
DataSize: Cardinal) |
AW: Abfrage des Seriellen Ports liefert nur Mist
Muss wohl an der Uhrzeit liegen, dass ich das irgendwie überlesen hatte :wall: Kann es vielleicht mit Unicode zu tun haben!?
-- EDIT: Wow... Beiträg 2000, herzlich Willkommen :mrgreen: *Freibier vergeb* |
AW: Abfrage des Seriellen Ports liefert nur Mist
Hey!
Sorry dass ich nun erst antworte. Die Batterie meiner Maus war leer. (und meine auch) Meint ihr echt das liegt am UniCode? Weil andere Sachen die über die Serielle Schnittstelle reinkommen (z.B. ein Embeded System, Soekris) sind richtige Zeichen (die auch einen Sinn ergeben). Grüße! |
AW: Abfrage des Seriellen Ports liefert nur Mist
Vielleicht liegt es daran dass dieses Gerät nicht per ASCII Protokoll kommuniziert?
Beim Protokoll hast Du nur <STX>/<ETX> geschrieben. Interessant wäre noch der Inhalt. Ansonsten würd ich's mal mit einer anderen Baudrate versuchen. 57600 Baud ist schon verdammt schnell. Ich kenne nur Sick Scanner die wegen dem Haufen von Daten so kommunizieren. |
AW: Abfrage des Seriellen Ports liefert nur Mist
Zitat:
Also folgende Informationen habe ich über das Netzteil: Zitat:
Zitat:
Bin im Moment echt überfragt. Grüße! |
AW: Abfrage des Seriellen Ports liefert nur Mist
Moin,
wie ein Unicode-Problem sieht das nicht unbedingt aus. Woher sollte da Unicode kommen? Eher nach einer falsch eingestellten Schnittstelle: die Stopbits sind nicht gekennzeichnet. Ich würde es erstmal mit dem Hyperterminal testen. Wenn es da richtig funktioniert, weißt Du die Einstellungen genau und kannst das Problem dann weiter eingrenzen. Grüße, Messie |
AW: Abfrage des Seriellen Ports liefert nur Mist
Sendest Du denn auch in <STX>/<ETX>?
Hast Du mal eine andere Baudrate versucht? Was verwendest Du für eine Komponente für RS232? Hast Du mal den Debugger angeworfen und das Receive vor dem ganzen Gedöns in cpDrvReceiveData angeschaut? Hast Du ein Terminal mit dem Du testen kannst? Eher nicht mit dem Hyperterminal da dieses doch ziemlich limitiert ist. Gibt aber hunderte freie. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:14 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