AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Abfrage des Seriellen Ports liefert nur Mist
Thema durchsuchen
Ansicht
Themen-Optionen

Abfrage des Seriellen Ports liefert nur Mist

Ein Thema von Chris4712 · begonnen am 9. Dez 2010 · letzter Beitrag vom 15. Dez 2010
Antwort Antwort
Seite 1 von 2  1 2      
Chris4712

Registriert seit: 24. Apr 2005
Ort: Herborn
25 Beiträge
 
Delphi 7 Enterprise
 
#1

Abfrage des Seriellen Ports liefert nur Mist

  Alt 9. Dez 2010, 23:31
Delphi-Version: 7
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!
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#2

AW: Abfrage des Seriellen Ports liefert nur Mist

  Alt 9. Dez 2010, 23:38
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.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Chris4712

Registriert seit: 24. Apr 2005
Ort: Herborn
25 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: Abfrage des Seriellen Ports liefert nur Mist

  Alt 9. Dez 2010, 23:53
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
  Mit Zitat antworten Zitat
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Abfrage des Seriellen Ports liefert nur Mist

  Alt 9. Dez 2010, 23:56
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!?
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#5

AW: Abfrage des Seriellen Ports liefert nur Mist

  Alt 9. Dez 2010, 23:57
Muss wohl an der Uhrzeit liegen, dass ich das irgendwie überlesen hatte Kann es vielleicht mit Unicode zu tun haben!?

-- EDIT: Wow... Beiträg 2000, herzlich Willkommen *Freibier vergeb*
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)

Geändert von s.h.a.r.k (10. Dez 2010 um 00:05 Uhr)
  Mit Zitat antworten Zitat
Chris4712

Registriert seit: 24. Apr 2005
Ort: Herborn
25 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: Abfrage des Seriellen Ports liefert nur Mist

  Alt 10. Dez 2010, 11:47
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!
  Mit Zitat antworten Zitat
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
526 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Abfrage des Seriellen Ports liefert nur Mist

  Alt 10. Dez 2010, 13:58
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.
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.
  Mit Zitat antworten Zitat
Chris4712

Registriert seit: 24. Apr 2005
Ort: Herborn
25 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: Abfrage des Seriellen Ports liefert nur Mist

  Alt 10. Dez 2010, 14:09
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!
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#9

AW: Abfrage des Seriellen Ports liefert nur Mist

  Alt 10. Dez 2010, 14:24
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
  Mit Zitat antworten Zitat
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
526 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Abfrage des Seriellen Ports liefert nur Mist

  Alt 10. Dez 2010, 14:27
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.
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz