Forum: Compiler & IDEs Schieberegister in C zur Stringauswertung


von Patrick B. (p51d)


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

von Klaus W. (mfgkw)


Lesenswert?

welche Hexwerte?

von Rolf M. (rmagnus)


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.

von Patrick B. (p51d)


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

von Rolf M. (rmagnus)


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.

von Patrick B. (p51d)


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

von kruemeltee (Gast)


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

von Patrick B. (p51d)


Lesenswert?

=> Protokoll?

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

von Ulf R. (roolf)


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.

von technikus (Gast)


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

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.