Wie einen Datenstrom auswerten
-
Halli Hallo,
ich habe einen Datenstrom der von der seriellen Schnittstelle kommt. Es sind ca. 4000Zeichen/sec die sich jede Sekunde wiederholen (Es sind Statusinformationen).
Ich habe mich gefragt wie ich die Daten am besten auswerte. Da ich nur einige der Daten brauche (ca. 200Zeichen) will ich nicht der Datenstrom einfach abspeichern und später auswerten, sondern ich will nur die Zeichen abspeichern die mich interessieren.
Bisher verwende ich eine, leider komplizierte, Methode mit vielen Zählern und Variablen um den Datenstrom sofort abzuspeichern.
Eine weitere angedachte Methode wäre jede Nachricht (also alle Zeichen innerhalb einer Sekunde) abzuspeichern und danach zu verarbeiten bevor die neue Nachricht kommt.
Was meint Ihr?

-
naja, wenn du weißt an welcher stelle die zweihundert zeichen stehen, lies doch einfach die 400 zeichen in den ram ein, und verarbeite nur die stelle, nach einer sekunde hast du die bestimmt verarbeitet, wenn ncih musst du sie extra in ne datei speichern. Dann kannst den speicher wieder freigeben und auf die nächsten 4k warten. 4K is echt kein Probelm für nen heutigen Computer

-
Danke schon mal für deine Antwort,
allerdings würde das Vorraussetzten, dass ich weiß wann die 200 Zeichen kommen (Die auch nur zufällig hintereinander liegen).
Der Rechner ist leider auch nicht mehr so neu (Geode mit 300MHz) und er muß noch andere Sachen erledigen. Mir liegt an der Geschwindigkeit.
Grüße
-
Evtl. Multithreaded machen, so dass ein Thread die Daten liesst, an den "Verarbeiterthread" weiterleitet und dann gleich weiterarbeiten kann.
-
naja... also wenn du echt keine ahnung hast, wann die zeichen auftreten und ob die überhaupt hintereinander kommen... Tja, dann bleibt dir nichts übrig als eben die daten danach zu durchsuchen, und wenn du das eben nicht in einer sekunde schaffst, dann musst du wohl oder übel die daten auf der festplatte puffern und später, wenn mal keine daten kommen auswerten. Is dann wohl die einzige Möglichkeit. Oder du bist eben schnell genug und kannst die daten in der sekunde auswerten, dann kannst das auch online machen.
Vielleicht kann man deinen Code ja noch ptimieren, die wie du die daten raussuchst, musstn dann aber ma zeigen
-
Mir ging es eher um die Art und Weise der Auswertung ohne auf eine spezielle Programmiersprache einzugehen.
Die Daten sind mit verschiedenen Startmarkierungen (festgelegte Zeichen) markiert.
Die Zeichen (...,10,2A,...) bedeuten also, dass die Nachricht 2A beginnt. In den Specs steht dann an welcher Stelle der Nachricht welche Info zu finden ist.
Eine meiner zetralen Fragen lautet:"Wie wartet man möglichst Rechenzeitschonend auf eine Folge von Zeichen in einem Datenstrom"? In diesem Fall also 10 gefolgt von 2A.
Grüße
-
naja, also wenn du wirklich nur nach dem Zeichen 102A suchst, dann kopier doch deinen Datenstrom in einen std::string (also jetzt in C++) und mach dann ein string::find("102A"); ich glaube was besseres als ne sequentielle suche gibts für dien Problem nich.
-
0Ahnung schrieb:
Die Zeichen (...,10,2A,...) bedeuten also, dass die Nachricht 2A beginnt. In den Specs steht dann an welcher Stelle der Nachricht welche Info zu finden ist.
mach es online. lies den datenstrom byteweise bis du auf 0x10 und diese message-id (0x2a) triffst. dann byteweise weiterlesen und irgendwas damit anstellen bis die message zuende ist. das ist oft besser als erstmal alles abzuspeichern und hinterher auszuwerten...
-
So wie "net" es beschreibt, mache ich die Auswerung zur Zeit. Ich habe nur leider einen Code geschrieben, der etwas unübersichtlich geworden ist. Ich werde Ihn nochmal schreiben, diesmal allerdings mit Funktionen (C++).
Dazu habe ich noch ein anderes Problem.
Auf dem gleichen Rechner läuft noch ein anderes Programm, das aber nicht von mir ist und von dem ich auch keine Code habe. Nun diesen Programm fordert fast die gesammte Rechenleistung, sodass ich Lücken in meiner Aufzeichnung habe.
Welche Möglichkeiten habe ich unter WinXP ein bestehendes Programm zu beeinflussen? Ich dachte man könnte die Priorität des Programmes verändern.Grüße
-
hm... naja priorität verändern müsste doch schon was bringen. Und die eigene Priorität hoch setzen. Und wenn alles nichts hilft: Kill das andere Programm

-
Maxi schrieb:
Und wenn alles nichts hilft: Kill das andere Programm
Na ja, das andere Programm ist der Sinn des Rechners. Wenn das nicht läuft, kann ich es auch lassen

Wie setzt man die Priorität eines Programmes runter, am besten per Batch-Script oder so -> WinXP.
Grüße
-
oder besser die rs232 mit rts/cts betreiben...
-
Was kann das?
-
damit kann der empfänger den sender stoppen, wenn er nicht hinterherkommt.
-
Vorausgesetzt, es ist beim Sender implementiert.
-
Ist es wahrscheinlich nicht. Die Daten kommen einfach über die Schnittstelle, was damit geschieht ist dem Sender egal.
Ich danke schon mal allen die sich die Zeit genommen haben zu antworten.
Ich werde meinen Code dahin überarbeiten, dass ich ihn lesbarer gestalte und evtl. die Daten sekundenweise speichere (jeweils ein komplettes Frame) und danach verarbeite.
Grüße
-
0Ahnung schrieb:
So wie "net" es beschreibt, mache ich die Auswerung zur Zeit. Ich habe nur leider einen Code geschrieben, der etwas unübersichtlich geworden ist. Ich werde Ihn nochmal schreiben, diesmal allerdings mit Funktionen (C++).
Dazu habe ich noch ein anderes Problem.
Auf dem gleichen Rechner läuft noch ein anderes Programm, das aber nicht von mir ist und von dem ich auch keine Code habe. Nun diesen Programm fordert fast die gesammte Rechenleistung, sodass ich Lücken in meiner Aufzeichnung habe.
Welche Möglichkeiten habe ich unter WinXP ein bestehendes Programm zu beeinflussen? Ich dachte man könnte die Priorität des Programmes verändern.Grüße
Wenn du schon C++ programmierst, dann mach es objektorientiert

-
DEvent schrieb:
Wenn du schon C++ programmierst, dann mach es objektorientiert

na klar
man kann alles mit gewalt in ein objektorientiertes schema pressen. egal wie widerspenstig sich das problem auch gibt...
-
es beantwortet meine Frage nicht bzw. es ist keine Lösung. Ich kann beide lösungen OO machen (den Datenstrom vorher speichern oder direkt auswerten) das Eine hat mit dem Anderen nichts zu tun.
Mir ging es um einen prinzipielle Lösung des Problems. Deshalb bin ich auch nicht ins C++-Forum gegangen. Die verwendete Sprache ist EGAL. Es ging nur darum verschiedene Wege zu diskutieren.
Aber trozden Danke für die Anteilnahme
Grüße