mikrocontroller.net

Forum: Compiler & IDEs Schieberegister in C zur Stringauswertung


Autor: Patrick B. (p51d)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo miteinadner

Ich habe ein kleines Problem bei dem ich irgendwie nicht auf einen 
grünen Zweig komme:
Bei einer Datenkommunikation über USB/RS232 möchte ich die Einkommenden 
Daten auf ein Steuerstring überprüfen. Einzelne Steuerkommandos kann ich 
nicht machen da bei den Hexwerten alles vorkommt. Jetzt dachte ich mir 
ich könnte in die Kommunikation Strings einpacken, die dann etwas 
steuern sollen, zum Beispiel abbruch ect.
Damit diese Strings eindeutig idendifiziert werden können, dachte ich 
mir das diese irgenwie so aussehen sollten:
"<<stop>>", "<<start>>", "<<pause>>"
Wie kann ich jetzt die eingehenden Daten einfach auf diesen String 
überprüfen? Mittels Schieberegister welches ich dann vergleiche? Wenn 
ja, wie kann ich ganze Bytes in einer Array verschieben?

Danke für die Antworten
MFG
Patrick

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
welche Hexwerte?

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Patrick B. schrieb:
> "<<stop>>", "<<start>>", "<<pause>>"
> Wie kann ich jetzt die eingehenden Daten einfach auf diesen String
> überprüfen? Mittels Schieberegister welches ich dann vergleiche?

Was für ein Schieberegister?

> Wenn ja, wie kann ich ganze Bytes in einer Array verschieben?

Indem du sie einzeln umkopierst. Stattdessen könntest du aber auch 
einfach einen Zeiger auf das erste Element zeigen lassen und dann durch 
Inkrementieren des Zeigers durch das Array "laufen".
Ich würde einfach die Funktion strstr() nehmen.

Autor: Patrick B. (p51d)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na die gesendeten Werte über USB sind PWM-Werte und Daten-Werte für eine 
Hydraulische Steuerung. Jeweils wird 1 Byte parallel über FT245 
eingelesen, und da können vom Nutzdatenbereich zwischen 0 und 255 alles 
vorkommen.

ein einzelnes Steuerzeichen fällt daher weg. Also muss ich irgendwie mit 
Strings arbeiten weil hier die wahrscheinlichkeit dass bei 7 und mehr 
Bytes gleich alle nacheinander folgenden Daten einem Steuerstring 
entsprechen unter 1 Promille

Rolf Magnus schrieb:
> Stattdessen könntest du aber auch
> einfach einen Zeiger auf das erste Element zeigen lassen und dann durch
> Inkrementieren des Zeigers durch das Array "laufen".

bei einem Buffer von 300 Werten müsste ich jedesmahl bei einem neuen 
Wert ALLE Werte überprüfen?
Ich dachte eher an so etwas dass ein Schieberegister für ca 10 Byte 
vorgesehen ist und wenn dann in diesen 10 Byte ein String übereinstimmt 
=> Aktion, ansonsten ältestes Byte raus, neues Rein -> Vergleich. und so 
weiter

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Patrick B. schrieb:
> Rolf Magnus schrieb:
>> Stattdessen könntest du aber auch
>> einfach einen Zeiger auf das erste Element zeigen lassen und dann durch
>> Inkrementieren des Zeigers durch das Array "laufen".
>
> bei einem Buffer von 300 Werten müsste ich jedesmahl bei einem neuen
> Wert ALLE Werte überprüfen?

Das hängt davon ab, wie du es programmierst. Wenn die Bytes einzeln 
reinkommen, kannst du das auch so machen:

Du hast einen Zeiger auf den Anfang deines Vergleichsstrings. Wenn ein 
Zeichen kommt, vergleichst du es mit dem, worauf dein Zeiger zeigt. Sind 
sie gleich, inkrementierst du den Zeiger, wenn nicht, setzt du ihn 
wieder auf den Anfang. Wenn nach dem Inkrementieren der Zeiger auf ein 
'\0'-Zeichen zeigt, hast du einen kompletten String gefunden.

> Ich dachte eher an so etwas dass ein Schieberegister für ca 10 Byte
> vorgesehen ist und wenn dann in diesen 10 Byte ein String übereinstimmt
> => Aktion, ansonsten ältestes Byte raus, neues Rein -> Vergleich. und so
> weiter

Es gibt keine "Schieberegister" für Arrays. Wenn du die Bytes "schieben" 
willst, mußt du sie alle einzeln jeweils um eins weiterkopieren.

Autor: Patrick B. (p51d)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf Magnus schrieb:
> Es gibt keine "Schieberegister" für Arrays. Wenn du die Bytes "schieben"
> willst, mußt du sie alle einzeln jeweils um eins weiterkopieren.

schade, in php oder c++ gibts so etwas wie push back.

Ok, ich werde dann das mal mit dem pointer versuchen.

Danke für die Hilfe

Autor: kruemeltee (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso lange Strings verwenden? Macht es nur aufwendiger...

Würde das eher so Lösen

1 byte startzeichen
1 byte "typ"
x bytes laenge der daten die kommen (bytes)
x bytes daten

fertig.

Jenachdem wieviel Daten du am Stück senden möchtest halt die Länge in 
einzelne Bytes zerlegt senden (z.B. 1 byte = 0...255 bytes kommen, 2 
byte Laenge = 0...65535 bytes kommen, ...)
Typ entweder Daten oder Kommando

Autor: Patrick B. (p51d)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
=> Protokoll?

ENQ ->
ACK <-
SOH ->
Command ->
Number of Bytes ->
Parameters ->
Checksumm ->
ACK / NACK <-
EOT ->

Autor: Ulf Rolf (roolf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Patrick B. schrieb:
> Na die gesendeten Werte über USB sind PWM-Werte und Daten-Werte für eine
> Hydraulische Steuerung. Jeweils wird 1 Byte parallel über FT245
> eingelesen, und da können vom Nutzdatenbereich zwischen 0 und 255 alles
> vorkommen.
>
> ein einzelnes Steuerzeichen fällt daher weg. Also muss ich irgendwie mit
> Strings arbeiten weil hier die wahrscheinlichkeit dass bei 7 und mehr
> Bytes gleich alle nacheinander folgenden Daten einem Steuerstring
> entsprechen unter 1 Promille

Solche "Fehlerwahrscheinlichkeiten" sollte man und kann man ganz einfach 
vermeiden.  Das vermeidet späteren Frust wegen "komischer Abstürze".
Ein einfacher Escape-Mechanismus würde es ja schon tun.

Autor: technikus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,


das hat mir weiter geholfen:

Beitrag "serielle datenübertragung pc <> AVR"

Ich kodiere die Daten auf der Senderseite als Hex in Einzelzeichen.

Für 255 sende ich 'F' 'F'. Vor einem Sendestream wird ein Startzeichen 
gesendet.

Der Empfänger synchronisiert sich auf das Startzeichen und sammelt dann 
die Daten ein. Nachdem alle Daten Empfangen wurde, erfolgt die 
Konvertierung der Einzelzeichen zurück in 8,16 oder 32 Bit Werte.

Bei dieser Art und Weise sind nur '0'...'9' und 'A'...'F' "belegt".
Alle anderen Zeichen kannst du dann für Kommandos etc. benutzen.


Gruß
Ernst

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.