Serielle Schnittstelle zeigt nur 8 Zeichen



  • Ich hab ne Komponente für die serielle Schnittstelle geschrieben. Die Daten lese ich per Interrupt aus (in einem Thread) und löse dabei ein Ereignis aus. Die gelesenen Daten werden in der Klasse gespeichert und können dort abgefragt werden. Wenn ich jetzt im ausgelösten Ereignis die Daten in ein Memo-Feld o.ä. reintue, gibt er mir immer nur 8 Zeichen aus. die nächsten Zeichen kommen dann in der nächsten Zeile. Ich hab schon alles versucht das zu vermeiden aber nichts hat geholfen. Weiß jemand von euch Rat?? Mir gehen nämlich langsam die Ideen aus.

    Danke schon mal 🙂



  • auf welches Ereigniss reagierst du denn?
    Und wieviele Zeichen sind zu diesem Zeitpunkt im Puffer?



  • Wie fügst du die Zeichen in das memo ein?

    -junix



  • @Silentsurfer

    nachdem ich den kompletten Puffer ausgelesen habe mache ich eine Zuweisung an die Klassenvariable, dann löse ich ein Benutzerdefiniertes Ereignis aus
    Beim Puffer ist es egal wieviele Bytes da drin stehen, er unterbricht immer nach 8 Byte

    @junix

    ich geb das ganze so aus

    Memo1->Lines->Add(SerialPort1->ReceifedText());
    

    Ich hab schon überlegt ob der Thread in der Zwischenzeit einfach neu gestartet wird, aber das kann ich mir nicht vorstellen



  • Im Puffer sind auf jeden Fall mehr als diese 8 Zeichen?
    wenn ja, sind es evtl. nichtChar Zeichen? (eine binäre Null würde ja als Stringende interpretiert)

    Lässt sich das Problem evtl. weiter einkreisen, also liegt es eher am auslesen des Puffers (und/oder übertragen in das Memofeld),
    oder kommen die Zeichen immer nur im 8 Zeichen Block in deinem Puffer an?

    Das deine Thread neu gestartet wird kann man natürlich erst im Quelltext wirklich sehen, ist aber eher unwahrscheinlich.



  • Ich habs jetzt weiter eingekreist:

    in meiner Variablen stehen alle (also mehr als die 8 Bytes) drin. Wenn ich das ganze mit dem Debugger langsam ablaufen lasse tut er auch was er soll, aber im normalen Durchlauf gibt er die 8 Zeichen aus, beginnt eine neue Zeile und schreibt da die nächsten 8 Zeichen hin, reicht das nicht aus, geht's mit der nächsten Zeile weiter.

    Ich hab das Gefühl, er möchte etwas machen ist aber nicht schnell genug. 😕



  • Lies mal was genau TMemo::Lines::Add genau macht...

    -junix



  • ich weiß nicht genau was du meinst... die Zeilenweise Verarbeitung vielleicht ???

    Ich hab es aber auch schon mit TMemo->Text oder TEdit->Text versucht, das bringt aber auch keine Verbesserung ???

    Hat sonst noch jemand eine Idee?? 😕



  • Wenn Du schon eine Komponente programmierst, dann sollte sie auch orthografisch korrekte Funktionsnamen haben:

    Memo1->Lines->Add(SerialPort1->ReceivedText());



  • @F98: Wenn du schon schlau daherredest, solltest du auch die richtigen Wörter benutzen... 😉 ...grammatikalisch...naja...

    Ich verstehe auch nicht was Junix will... 😞



  • Eberhard schrieb:

    [...]Wenn ich jetzt im ausgelösten Ereignis die Daten in ein Memo-Feld o.ä. reintue, gibt er mir immer nur 8 Zeichen aus. die nächsten Zeichen kommen dann in der nächsten Zeile.

    Ich übersetz mal
    TMemo::Lines::Add nach deutsch:
    TMemo::Zeilen::Hinzufügen

    klingelts jetzt?

    -junix



  • Aber er fügt doch EINE Variable mit mehr als 8 Zeichen ein??? Lines::Add() erklärt doch nicht den Zeilenwechsel nach 8 Zeilen?? Oder wie?

    Ist da ein '\n' dabei?

    @F98: Geht doch! 😃 Leider kann ich nicht editieren...



  • @Eberhard
    Benutzt du die Win Api aufrufe zur Kommunikation mit dem Com Port
    CreateFile()
    und dann ReadFile()?

    Wenn ja, wann rufst du ReadFile auf? evtl. Interuptgesteuert /Zeichengesteuert?

    Was sagt denn da der Rückgabewert?

    @Plemplem
    ist nicht gesagt, wenn er im echtbetrieb so schnell liest, das nur 8 Zeichen im Puffer stehen, dann fügt jedes Add eine neue Zeile ein.



  • @SilentSurfer

    genau ich benutze die API Aufrufe Das Lesen geschieht interruptgesteuert mit ReadFile. Wenn ich mir die Variable im Debugger anschaue steht auch der ganze Text drin.

    @junix

    wie gesagt, ich hab auch schon mit dem Edit Feld und Text und dem Memofeld und Text experimentiert, aber da hat sich gar nichts verändert



  • Jetzt brauchts doch noch ein paar informationen,
    ReadFile gibt dir im dritten (oder vierten) Parameter die Anzahl der gelesenen Bytes, hast du den Wert mal im Echtbetrieb überprüft?

    Wie sieht dein DCB aus? Was setzt du in der CommMask? Auf was spricht dein Interrupt beim Lesen an, und dazu passend, wie sieht so eine Bytefolge aus, die du empfangen willst?

    Ein wenig Source wäre jetzt vielleicht ganz hilfreich.



  • Die Dinge werd ich heute Abend mal prüfen. Im Moment hab ich keine Zeit mehr...



  • Ich habs jetzt!!! 😋

    Das Problem war, daß die Zeichen bei der Schnittstelle langsamer angekommen sind, als die Komponente sie im Puffer ausgelesen hat. Nach 8 Zeichen war der Puffer leer und er hat das Ergebnis zurückgeliefert. Unmittelbar danach sind die nächsten Zeichen angekommen und das ganze ging von vorne los.

    Ich hab ihn jetzt nach jedem gelesenen Zeichen kurz "schlafen geschickt" und jetzt liest er das ganze problemlos ein.

    Vielen Dank an alle die sich mit beteiligt haben



  • Eberhard schrieb:

    Ich hab ihn jetzt nach jedem gelesenen Zeichen kurz "schlafen geschickt" und jetzt liest er das ganze problemlos ein.

    Meines Erachtens eine eher unsaubere Methode... Besser wäre es hier zwischen Anzeige und COM-Port einen Protokoll-Codec zu implementieren, der die einzelnen Protokollframes einliest und erst dann zurückliefert...

    -junix


Anmelden zum Antworten