mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Strings aus RS232 Datenstream erkennen?


Autor: GooM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das wird Zeitkritisch werden. In C sollte das so aussehen:

#define BUFFER_LENGTH 25
#define STR_LENGTH 15

char* str[15] = {...};

uint8_t buffer[BUFFER_LENGTH];
uint8_t pos;

void UpdateBuffer(uint8_t next)
{
    buffer[pos++] = next;
    if(pos == BUFFER_LENGTH)
        pos = 0;
    uint8_t i = STR_LENGTH - 1;
    do
    {
        str_cmp(str[i]);
    }
    while(i--);
}

void str_cmp(char* cmp)
{
   //Hier wird buffer mit cmp verglichen. das erste Zeichen von cmp muss
   //mit buffer[pos] verglichen werden!
}


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.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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.

Autor: Dirk H. (dirk-h)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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)

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: sebastians (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: elenorus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmmm,gute Frage, stehe vor dem selben Problem!?

Hat schon jemand eine Lösung?

Autor: durchblicker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Rene Zimmermann (renezimmermann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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ß

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.