Hallo, liebe Gemeinde, wie im Betreff (etwas unglücklich) beschrieben, möchte ich gern einen Datenstream einer RS232 quasi "belauschen" und auf gewisse "Bytefolgen" reagieren und entsprechende Aktionen auslösen. Die Kommunikation findet zwischen zwei Geräten mit 57600Bit/s statt und es soll nur die Sendeleitung des einen Gerätes belauscht werden. Der Datenstrom hat keine signifikanten Muster, als das sich die auszu- lesende Bytefolge durch gewisse sequenzen ankündigt und man diese zum Vergleich vollständig einlesen könnte. Desweiteren soll nicht nur eine Bytefolge zuverlässig erkannt werden, sondern "in Echtzeit" auf mindestens 15 unterschiedliche Bytefolgen mit unterschiedlichen Längen bis 25 Byte geprüft werden. Das ganze soll in Assembler umgesetzt werden,da es warscheinlich sehr zeitkritisch wird....? ...soviel zum Vorhaben ;-) Warum ich mich an Euch wende: -In der Forensuche und im übrigen Internet fand ich nix passendes zu dieser Problematik -Ich würde mich freuen, wenn es jemanden gäbe der vielleicht an einem ähnlichen Vorhaben Arbeitet und mit mir darüber Fachsimpeln möchte -Ich möchte kein "fertiges Programm" --> selber Programmieren macht Spaß! -Es geht mir nur um eine Problembeschreibung, unabhängig von der Programmiersprache,vielleicht können wir genug Informationen extra- hieren, welche anderen Usern bei ähnlichen Problemen helfen? Meine konkreten Fragen: -Ist überhaupt jemand aus meiner Problembeschreibung schlau geworden? -glaubt jemand, das dies mit einem Atmega8 zu realisieren ist? -Welche Vorgehensweise könnte man als grundlegendes Modell in betracht ziehen? Vielen Dank fürs Lesen,auch wenn Du mir nicht helfen kannst ;-) GooM
Das wird Zeitkritisch werden. In C sollte das so aussehen:
1 | #define BUFFER_LENGTH 25
|
2 | #define STR_LENGTH 15
|
3 | |
4 | char* str[15] = {...}; |
5 | |
6 | uint8_t buffer[BUFFER_LENGTH]; |
7 | uint8_t pos; |
8 | |
9 | void UpdateBuffer(uint8_t next) |
10 | {
|
11 | buffer[pos++] = next; |
12 | if(pos == BUFFER_LENGTH) |
13 | pos = 0; |
14 | uint8_t i = STR_LENGTH - 1; |
15 | do
|
16 | {
|
17 | str_cmp(str[i]); |
18 | }
|
19 | while(i--); |
20 | }
|
21 | |
22 | void str_cmp(char* cmp) |
23 | {
|
24 | //Hier wird buffer mit cmp verglichen. das erste Zeichen von cmp muss
|
25 | //mit buffer[pos] verglichen werden!
|
26 | }
|
Nur mal als Beispiel. Da kann man aber sicher noch eine Menge verbessern. Die Strings könnte man auch in den Flash stecken. Ist sicher nicht fehlerfrei, habs nicht getestet.
Könnte man mit einem Automaten realisieren. Dazu benötigt man ein Register als Zustandszähler, der gleichzeitig dazu dient, das als nächste zu erwartende Zeichen aus dem Speicher zu laden. Kommt dieses Zeichen per UART an, wird der Zähler inkrementiert und ein neues Zeichen geladen und gewartet. Kommt irgendwann ein falsches Zeichen, wird der Zähler rückgesetzt.
>Die Kommunikation findet zwischen zwei Geräten mit 57600Bit/s statt und >Das ganze soll in Assembler umgesetzt werden,da es warscheinlich sehr >zeitkritisch wird....? Ich lach mich tot. In C hab ich selbst mit 115200 Baud keine Probleme.
@Samuel Dein Code ist absoluter Quark, nochmal lesen ..... oben. >"in Echtzeit" auf mindestens 15 unterschiedliche Bytefolgen mit >unterschiedlichen Längen bis 25 Byte geprüft werden. dynamische Auswertung mit tabellarischem Vergleich notwendig. @GooM welche MCU eigentlich, bei welcher Frequenz (nur interessenhalber)
holger schrieb: > Ich lach mich tot. In C hab ich selbst mit 115200 Baud > keine Probleme. Statt ich lach mich tot hättest du sagen können wie. Wenn man es anderst macht geht es tatsächlich. Man könnte immer speichern seit wieviel Zeichen die Zeichenfolge fehlerfrei ist. So hat man nur 15 Vergleiche pro empfangenes Zeichen. Dirk H. schrieb: > Dein Code ist absoluter Quark, nochmal lesen ..... oben. OK er war ineffektiv, aber das habe ich jetzt korrigiert. Warum denn der TE möchte doch folgendes: "asdflgabcjfdgj" in diesen stream möchte er nun z.b. in echtzeit "abc" finden, oder stimmt das nicht? > welche MCU eigentlich, bei welcher Frequenz (nur interessenhalber) Lies du lieber nochmal oben.
Vielleicht hilft auch ein DFA. Sind die zu erkennenden Zeichenfolgen schon im Vorraus bekannt? Schneller gehts nicht. Kann aber sein, dass die Zustandsübergangstabelle nicht in den Speicher passt.
hmmm,gute Frage, stehe vor dem selben Problem!? Hat schon jemand eine Lösung?
also ich habe Deine Problemstellung NICHT verstanden. Da kommen Daten rein welche Du erkennen möchtest, hast aber keine Ahnung was Du vergleichen kannst, da der Datenstrom keine signifikanten Muster hat ??? Willst Du ne Glaskugel programmieren ? DS
>Der Datenstrom hat keine signifikanten Muster, als das sich die auszu- >lesende Bytefolge durch gewisse sequenzen ankündigt und man diese zum >Vergleich vollständig einlesen könnte. Aha, woher weiss dann das andere Gerät wann die Daten kommen? Werden vieleicht zeitlich abgetrennte Frames gesendet? Kann mir das nicht so recht vorstellen. Gruß
elenorus schrieb: > hmmm,gute Frage, stehe vor dem selben Problem!? > > Hat schon jemand eine Lösung? Einfach mal hinsetzen und überlegen, wie du es händisch machen müsstest, wenn du 15 verschiedene Sequenzen in einem Datenstrom erkennen müsstest. Wie würdest du das machen? Es ist wirklich sehr einfach und die Lösung wurde auch schon angesprochen: Einfach bei jedem Muster mitzählen, wieviele Zeichen schon richtig waren.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.