Einzelnen Beitrag anzeigen

oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#1

#13#10 bei Datenempfang mit TApdComPort

  Alt 24. Jan 2008, 10:14
Hi Leute,

ich kämpfe schon seit zei Tagen mit dem Problem und finde keine Lösung. Folgender Sachverhalt:

ich empfange Daten mit der Kompo TApdComPort. Jedesmal wenn in der Mitte eines empfangenen Teilstrings das Ereignis OnTrigger ausgelöst wird, hängt mir die Compo ein #13#10 zusätzlich ans Ende. damit geht natürliche meine Decodierung in die Tonne.

Hier mein Trace nach dem Auslesen:
Zitat:

PTCarphone
PTC V0.01.00 16.01.2007

?: Hilfetext
T: Liste Telefonbuch
C: Konfiguration
A.. Befehlseingabe
ESC: Ende Servicemode

OK
Hier der Trace des Kompoeigenen Trace-Files:
Zitat:
Receive:
[0D][0A]PTCarphone[20]PTC[20]V0.01.00[20]16.01.2007[0D][0A][0D][0A]?:[20][20]
[20]Hilfetext[0D][0A]T:[20][20][20]Liste[20]Telefonbuch[0D][0A]C:[20][20][20]K
onfiguration[00][00][0D][0A]A..[20][20]Befehlseingabe[0D][0A]ESC:[20]Ende[20]S
ervicemode[0D][0A][0D][0A]OK[0D][0A]
Hinter dem Eintrag "PTCarphone" wird also definitiv kein #13#10 gesendet. Warum empfange ich dann aber eins? Dabei ist zu bedenken, das mein Trace den String aus FReceiveData darstellt. Somit befindet sich der Zeilenumbruch im FReceiveData und wird nicht etwa durch eine Zeilenweise Ausgabe im Memo erzeugt.

Ich gebe euch hier mal meinen komplette Code incl. auskommentierter Testzeilen der Ereignisbehandlungsroutine. So könnt ihr auch sehen, was ich alle so ausprobiert habe.

Delphi-Quellcode:
procedure TTransactionComPort.OnTrigger(CP: TObject; Msg, TriggerHandle,
  Data: Word);
var Counter : Integer;
    C : Char;
    s : string;
    RLen : Word;
begin
  case Msg of
    APW_TRIGGERAVAIL : begin    //Corresponds to OnTriggerAvail.
{
      for Counter := 1 to Data do begin
        if FComPort.InBuffUsed > 0 then begin
          try
            C := FComPort.GetChar;
            FReceivedData := FReceivedData + c;
          except end;
        end;
      end;
}

// DoReceiveMsg(FReceivedData);
{
      RLen := FComPort.InBuffUsed;
      SetLength(s, RLen);
      FComPort.GetBlock(s[1], RLen);
      FReceivedData := FReceivedData + s;
}

    end;
    APW_TRIGGERDATA : begin    // Corresponds to OnTriggerData. erwarteter Rückgabewert empfangen
{
      for Counter := 1 to Data do begin
        if FComPort.InBuffUsed > 0 then begin
          try
            C := FComPort.GetChar;
            FReceivedData := FReceivedData + c;
          except end;
        end;
      end;
}

      RLen := FComPort.InBuffUsed;
      SetLength(s, RLen);
      FComPort.GetBlock(s[1], RLen);
      FReceivedData := FReceivedData + s;

      if TriggerHandle = FResulttrigger then begin
        FComPort.RemoveTrigger(FResultTrigger);
        FResultTrigger := 0;
      end;
      DoReceiveMsg(FReceivedData);
    end;
    APW_TRIGGERTIMER : begin    // Corresponds to OnTriggerTimer. Timeout des Befehls erreicht

    end;
    APW_TRIGGERSTATUS : ;    // Corresponds to OnTriggerStatus.

  end;
end;
Ich habe persönlich das Gefühl, das die Compo nach jedem leeren des Windows-Buffers und übertragen in den eigenen Buffer einen Zeilenumbruch einfügt.

Ich habe mehrere DataTrigger gesetzt, die aber nicht zu diesem Zeilenumbruch passen.

Ich hoffe jemand hat da eine Idee was da los ist.

dank und Gruß oki
42
  Mit Zitat antworten Zitat