Wie Daten austauschen bzw. weitergeben



  • Guten Abend,

    ich möchte einmal Daten von einer seriellen Schnittstelle lesen und einmal von USB. Dann sollen die Daten an Matlab weitergegben werden.

    Die beiden Sachen laufen jeweils in einem eigenen Thread. Ich dachte mir das ich die Daten in einen Shared-Memory schreibe und in der Main zwei Funktionen schreibe in der ich diesen Shared-Memory zurückgebe.

    Gibt es dort einen besseren Weg? Später müssen die Daten jeweils Synchron übergeben bzw. werden abgerufen.

    Z.B.
    Matlab ruf Funktion1:getSharedSerial
    und dann danach Funktion2:getSharedUSB

    Vielleicht so eine Art Queue bzw. Buffer? Wichtig ist das die Daten gezählt werden können, damit man weiß welchen Daten zusammengehören.

    Das ganze soll auch noch in Echtzeit laufen,da die Daten in Matlab dann geplottet werden.

    Ich bin offen für ein paar Denkanstösse 😋

    MfG



  • 😞 hat niemand einen Vorschlag? oder versteht niemand was ich will?



  • larzarus schrieb:

    😞 versteht niemand was ich will?

    Bingo. 😉
    Was ist das konkrete Problem? Ich habe es nicht begriffen.
    Wenn du Hilfestellung bei einem Konzept oder Design brauchst, geh in ein anderes Forum. Hier geht es speziell um C++ 😉
    Und wenn du dann ein C++-Problem hast (konkrete Implementierung, o. ä.) kommste zurück.



  • Also ich habe einen Thread da werden Daten von einer seriellen Scnittstelle gelesen.

    Diese möchte ich nun in ein Array schreiben. Ist sowas schon ein Buffer?

    die Frage ist nun wie liest man ihn aus und wie schreibt man in ihn.

    Meine Vorstellung:
    ich lese immer von 0-1023 und ich schreibe immer von 0-1023.
    Wie kann ich sicherstellen, das ich nicht schneller lese als schreibe bzw. umgekehrt?

    Wie geht ihr an so ein Problem ran?


  • Mod

    Mach es doch wie die C++-Streams: Schreib einen internen Puffer mit den Daten voll, wenn der Puffer zu leer wird, schreibst du was rein. Eigentlich ist das Problem ziemlich gut lösbar, indem du dir eine Klasse von streambuf ableitest und dessen virtuellen Funktionen für das Lesen mit deinem Code zum Lesen von der Schnittstelle überschreibst. Die Basisfunktionen des streambuf organisieren dann schon alles korrekt so, dass immer Daten geholt werden, wenn Daten gebraucht werden. Und du kannst das dann ganz wunderbar an einen std::istream anbinden und direkt alle dir bekannten Lesefunktionen wie gewohnt benutzen.



  • FIFO, vorne lesen, hinten schreiben



  • larzarus schrieb:

    Also ich habe einen Thread da werden Daten von einer seriellen Scnittstelle gelesen.

    (...)

    die Frage ist nun wie liest man ihn aus und wie schreibt man in ihn.

    (...)

    Wie geht ihr an so ein Problem ran?

    Deine Fragen sind viel zu Allgemein, die Informationen die du gibst zu spärlich.

    Was sind das für Daten? Wo passiert die "Auswertung" bzw. Deserialisierung? Wie kannst du Erkennen wenn Teile aus dem Datenfluss fehlen (kann passieren wenn irgendwo ein Puffer überläuft)? Wie soll reagiert werden wenn sowas passiert ist? Braucht Matlab immer den gesamten Datenstrom der seit dem letzten GetBlubb() Aufruf angekommen ist, oder reicht einfach immer der aktuelle Wert?

    Uswusf.


Anmelden zum Antworten