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
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.
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
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.
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
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
=> Protokoll? ENQ -> ACK <- SOH -> Command -> Number of Bytes -> Parameters -> Checksumm -> ACK / NACK <- EOT ->
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.