Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Abfrage des Seriellen Ports liefert nur Mist (https://www.delphipraxis.net/156660-abfrage-des-seriellen-ports-liefert-nur-mist.html)

Chris4712 9. Dez 2010 23:31

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:
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;
Bitte bitte helft mir!

Grüße!

s.h.a.r.k 9. Dez 2010 23:38

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.

Chris4712 9. Dez 2010 23:53

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

gmc616 9. Dez 2010 23:56

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:
cpDrvReceiveData(Sender: TObject; DataPtr: Pointer;
  DataSize: Cardinal)
liefert schließlich nur einen Pointer auf eine gewisse Anzahl von Bytes. Wer sagt dir, dass die gelieferten Daten AnsiStrings (Delphi7!) sind!?

s.h.a.r.k 9. Dez 2010 23:57

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*

Chris4712 10. Dez 2010 11:47

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!

taveuni 10. Dez 2010 13:58

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.

Chris4712 10. Dez 2010 14:09

AW: Abfrage des Seriellen Ports liefert nur Mist
 
Zitat:

Zitat von taveuni (Beitrag 1067699)
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.

Hey!

Also folgende Informationen habe ich über das Netzteil:
Zitat:

Schnittstellenparameter:
Baudrate: 57600 baud
Datenbits: 8
Parity: keine
Protokoll: <STX>/<ETX>
verwendete Abkürzungen:
<STX> „Start of Text“ (ASCII-Code 2)
wird vor Beginn eines Befehls gesendet
<ETX> „End of Text“ (ASCII-Code 3)
wird nach Ende eines Befehls gesendet
<ACK> „Acknowledge“ (ASCII-Code 6)
Antwort, wenn Stellbefehl erfolgreich abgearbeitet wurde
<NAK> „Negative Acknowledge“ (ASCII-Code 21)
Antwort, wenn Stellbefehl nicht durchgeführt werden kann
<ERR> Error (ASCII-Code 7)
Antwort, wenn Stellbefehl unbekannt ist
<Z> Zahl mit Dezimalpunkt und einer Nachkommastelle z.B. 12.3 oder 012.3
Befehlsaufbau:
Steuerbefehle und Antworten werden in Form von ASCII-Zeichenketten übertragen.
Als Startzeichen wird <STX> - als letztes Zeichen <ETX> verwendet.
Zwischen Groß- und Kleinschreibung wird unterschieden.
Und hier noch ein paar Befehle:
Zitat:

Beispiel für Steuerbefehle:
<STX>OUT:UOUTS?<ETX>
Dieses Befehl ist ein READ-Befehl. Die Ausgangsspannung wird abgefragt.
<STX>OUT:UOUTS,24.0<ETX>
Dieses Befehl ist ein WRITE-Befehl. Die Ausgangsspannung wird auf 24,0V gesetzt.
Also von daher: Baud Rate ist OK (Hersteller Software ist auch auf diese eingestellt), ASCII laut Anleitung auch...

Bin im Moment echt überfragt.

Grüße!

messie 10. Dez 2010 14:24

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

taveuni 10. Dez 2010 14:27

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.

rollstuhlfahrer 10. Dez 2010 14:35

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

Muellermilchtrinker 10. Dez 2010 14:53

AW: Abfrage des Seriellen Ports liefert nur Mist
 
Kannst ja auch mal TComport probieren:
http://sourceforge.net/projects/comport/

Echt gut, damit steuer ich auch meine RS232 Sachen an. :thumb:

Chemiker 10. Dez 2010 16:13

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

LargoD 10. Dez 2010 17:31

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

Chris4712 11. Dez 2010 15:53

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!

LargoD 11. Dez 2010 17:48

AW: Abfrage des Seriellen Ports liefert nur Mist
 
Zitat:

Zitat von Chris4712 (Beitrag 1067937)
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.

Deshalb: Netzteil abhängen und Brücke am PC zwischen Pin 2 und Pin 3!
Dann empfängst Du genau das was Du gesendet hast.
Gruß
Erich

Chris4712 13. Dez 2010 16:14

AW: Abfrage des Seriellen Ports liefert nur Mist
 
Zitat:

Zitat von LargoD (Beitrag 1067951)
Deshalb: Netzteil abhängen und Brücke am PC zwischen Pin 2 und Pin 3!
Dann empfängst Du genau das was Du gesendet hast.
Gruß
Erich

Hey Erich!

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

shmia 13. Dez 2010 16:34

AW: Abfrage des Seriellen Ports liefert nur Mist
 
Zitat:

Zitat von Chris4712 (Beitrag 1067937)
...Mit Hyper Terminal und auch mit Putty kann ich ich zwar verbinden, dann aber keine Eingabe machen

Das ist doch kein Problem.
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.

p80286 14. Dez 2010 20:30

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

Chris4712 15. Dez 2010 12:24

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