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


von GooM (Gast)


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

von Sam .. (sam1994)


Lesenswert?

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.

von Daniel (Gast)


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.

von holger (Gast)


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.

von Dirk H. (dirk-h)


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)

von Sam .. (sam1994)


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.

von sebastians (Gast)


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.

von elenorus (Gast)


Lesenswert?

hmmm,gute Frage, stehe vor dem selben Problem!?

Hat schon jemand eine Lösung?

von durchblicker (Gast)


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

von Rene Z. (renezimmermann)


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ß

von Karl H. (kbuchegg)


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.

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
Noch kein Account? Hier anmelden.