![]() |
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. |
AW: Abfrage des Seriellen Ports liefert nur Mist
bei deinen angegebenen Befehlen in #1 ist da die Spannung immer gleich? - Wenn ja, bekommst du von irgendwo Müll rein, der da nicht sein sollte. Ich tippe mal, dass bei gleicher Spannung und Anfrage die Antwort auch gleich sein sollte.
Bernhard |
AW: Abfrage des Seriellen Ports liefert nur Mist
Kannst ja auch mal TComport probieren:
![]() Echt gut, damit steuer ich auch meine RS232 Sachen an. :thumb: |
AW: Abfrage des Seriellen Ports liefert nur Mist
Hallo Chris4712,
Du muss den String so senden #2DasistmeinText#3, wenn Du ihn lesen willst solltest Du STX(#2) und ETX (#3) wieder raus filtern. Bis bald Chemiker |
AW: Abfrage des Seriellen Ports liefert nur Mist
Zum Test mal das Netzteil abhängen und an der seriellen Schnittstelle des PC zwischen Pin 2 und Pin 3 eine Brücke machen. Dann muss genau das zurückkommen, was Du gesendet hast. Dann ist schon mal klar, dass Senden und Empfangen funktioniert.
Dann mit einem Terminal-Programm das Netzteil ansprechen. Bei ASCII-Kommunikation zeigt das sofort, ob die Schnittstellenparameter richtig sind. Gruß Erich |
AW: Abfrage des Seriellen Ports liefert nur Mist
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo an alle!
Erst einmal: Vielen lieben Dank dass mir hier sooo viele helfen!!! Habe mal ein wenig weiter getestet: 1) Mit Hyper Terminal und auch mit Putty kann ich ich zwar verbinden, dann aber keine Eingabe machen. Und das Netzteil liefert ja nur was zurück wenn es einen Befehl bekommt. 2) Wenn ich WideString statt String verwende kommt auch mit dem EmbeddedSystem nur Mist zurück?! 3) Empfangen geht auf jeden Fall, siehe 2) EmbeddedSystem ist wunderbar zu lesen Ich habe euch mal das ganze Projekt angehängt. Ich denke es erleichtert euch die Sache eindeutig. Grüße! |
AW: Abfrage des Seriellen Ports liefert nur Mist
Zitat:
Dann empfängst Du genau das was Du gesendet hast. Gruß Erich |
AW: Abfrage des Seriellen Ports liefert nur Mist
Zitat:
OK, habe deinen Rat befolgt. Klappt wunderbar! Wenn ich die Brücke drin habe kommen die gleichen Zeichen an, die ich los sende. In meinen Augen sieht es also so aus: Das Programm funktioniert so wie es soll und empfängt / sendet so wie es sein sollte. Jedoch hat das Programm ein Problem mit dem Verarbeiten der Zeichen die vom Netzteil gesendet werden. Leider weiß ich noch nicht welches Problem dies ist geschweige denn wie ich dieses Problem behebe. Gruß Christian |
AW: Abfrage des Seriellen Ports liefert nur Mist
Zitat:
Mit einem Editor bereitest du dir eine (oder mehrere) TXT-Datei(en) mit den Befehlen die du senden möchtest vor. Im Menü von Hyper Terminal: Übertragung -> Textdatei senden. Bevor das nicht 100%ig funktioniert brauchst du an deinem Programm gar nicht erst weitermachen. |
AW: Abfrage des Seriellen Ports liefert nur Mist
Noch ein Einwand, dieses ??x% Zeug hilft nicht wirklich weiter. Wie wäre es mal mit hexadezimaler Darstellung? Und bitte das, was in den Registern ankommt, und nicht etwas was durch drei Treiber vorgekaut wurde.
Hatte da nicht jemand was von Stop-Bits geschrieben? Und ASCII ist nicht 8 sondern 7 Bit! (so kann man 8 Zeichen in 7 Byte über die Leitung schicken) Gruß K-H |
AW: Abfrage des Seriellen Ports liefert nur Mist
Hey!
Könntet Ihr mit das bitte ein wenig genauer erklären? Wie bereits geschrieben habe ich mit seit Jahren nicht mehr mit Delphi beschäftigt. Blick da also überhaupt nicht mehr durch! Danke! Grüße! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:18 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