Hallo, ich bin noch recht am Anfang mich in C und die Programmierung des AVR einzuarbeiten und habe ein konkretes Problem bei dem ich nicht weiter komme. Sachverhalt: Ich bekomme über die serielle Schnittstelle Daten (ca. alle 2 Sekunden so 250 Byte). In dem Datentelegramm möchte ich nun bestimmte Stellen herausfiltern auf die nähmlich die für mich maßgeblichen Werte stehen. Meine Idee war eine Zeichenkette die ich auffülle dann mit dem gesuchten Muster vergleiche, beim nächsten Byte dann das ganze ein Byte nach links schiebe, wieder vergleiche usw.... Geht das überhaupt so? Wie würdet ihr das machen? Hab schon C Erfahrung jedoch ist schon ne Zeit her (Microsoft Quick C). Wer das kennt weiß wie lange das her ist. Natürlich habe ich schon gesucht doch wenn ich weiter gekommen wäre hätte ich die Frage sicher nicht hier gestellt. Grüße Günter
Günter H. schrieb: > Ich bekomme über die serielle Schnittstelle Daten (ca. alle 2 Sekunden > so 250 Byte). In dem Datentelegramm möchte ich nun bestimmte Stellen > herausfiltern auf die nähmlich die für mich maßgeblichen Werte stehen. Wie sieht dieses "Datentelegramm" aus? Welches protokoll/ein beispiel? > Meine Idee war eine Zeichenkette die ich auffülle Wie ist das gemeint? Werden die ankommenden daten in ein char array eingelesen? Wird der speicher dynamisch reserviert? > dann mit dem gesuchten > Muster vergleiche, beim nächsten Byte dann das ganze ein Byte nach links > schiebe, wieder vergleiche usw.... > > Geht das überhaupt so? Wie würdet ihr das machen? Ja. Den umweg mit der zeichenkette kann man vileicht auslassen. Wenn es um das parsen von daten geht empfehle ich eine state maschine, welche immer je ein zeichen parst.
Günter H. schrieb: > beim nächsten Byte dann das ganze ein Byte nach links > schiebe Das ist ... sehr ineffizient. Starte doch einfach die Vergleichsoperation nicht am ersten, sondern am zweiten, und dann amn dritten etc. Byte. Wenn Du aber von "Datentelegramm" redest, hat das einen irgendwie strukturierten Aufbau? -- Quick-C kenne ich. War schrecklich. Habe dann Turbo C 2.0 mit den exzellenten deutschsprachigen Handbüchern von Arne Schäpers in die Hände bekommen ...
Daniel A. schrieb: > Den umweg mit der zeichenkette kann man vileicht auslassen. Wenn es um > das parsen von daten geht empfehle ich eine state maschine, welche immer > je ein zeichen parst. Hallo Daniel, vielleicht erwähnte ich schon das meine C-Kenntnisse zum einen nie excellent waren und das was da ist muss ich in den Tiefen meiner Hirnwindungen wieder aktivieren. Deshalb entschuldige die blöde Frage doch: Der Begrifft state maschine ist mir neu. Magst du das näher erklären? Gruß. Günter
Rufus Τ. Firefly schrieb: > Das ist ... sehr ineffizient. Starte doch einfach die > Vergleichsoperation nicht am ersten, sondern am zweiten, und dann amn > dritten etc. Byte. Wollte das auch so machen doch irgendiwe weiß ich nicht wie ich dass effizient aufbauen/programmieren soll. > > Wenn Du aber von "Datentelegramm" redest, hat das einen irgendwie > strukturierten Aufbau? Hat es, doch ganz ehrlich blicke ich das nur bedingt. Es geht um die Ausgabe von bestimmten Stromzählern in SML (bitcodiert) Beispiel: Startsequenz 1B 1B 1B 1B Protokollvers. 01 01 01 01 Dann kommt einiges uninteressantes gefolgt von z.B. 77 07 10 01 08 00 FF danach eine festgelegte Anzahl Bytes gefolgt von den relevanten Daten. Also zu Quick-C muss ich sagen dass die Bücher die im Paket von Microsoft enthalten waren, wirklich gut waren oder war ich damals einfach gescheiter als heute. Die waren im übrigen auch alle in deutsch. Hab dann eine Zeit Pause gemacht und mir damals den C++ Builder zugelegt. Gruß Günter
Hallo, also wenn ich so sehe wieviel Antworten andere mit Ihren Beiträgen bekommen frage ich mich ob ich vielleicht meine Fragen im falschen Forum stelle oder vielleicht im falschen Bereich. Natürlich ist es wichtig zu diskutieren ob dem einen jetzt Target oder Eagle besser gefällt. Ich finde ein Forum eine hervorragende Möglichkeit Antworten auf Fragen zu bekommen und bedaure es sehr wenn ein Forum mehr für den Austausch persönlicher Vorlieben und Meinungen genutzt wird. So was bin ich von anderen Foren (z.B. zu Motorrädern) nicht gewohnt. Ich finde das einfach schade.
So ein Beitrag geht üblicherweise in zwei Richtungen. Da sind zum einen Deine Fragen und zum anderen Fragen derer die Dir helfen wollen. Weden aber, so einfache Fragen wie: >Wie sieht dieses "Datentelegramm" aus? >Welches protokoll/ein beispiel? ... und ähnliches nicht beantwortet, so zwingst Du die Helfer zum Raten oder zum herbeiholen der Glaskugel. Da kann schon mal der St. Nimmerleinstag dazwischenkommen. Also: Problem genau beschreiben (möglichst mit Beispielen) oder sein lassen. Ich unterstelle mal, dass Dir mit irgendwelchem Sermon nicht gedient ist.
Hallo, ich gehe jetzt mal davon aus das du den dritten Beitrag nicht angeschaut hast. SML ist das Protokoll und ein Beispiel habe ich auch eingebracht. Hier die Definition des Protokolls: http://www.vde.com/de/fnn/arbeitsgebiete/messwesen/Sym2/Infomaterial/Documents/SML_081112_103.pdf Würde ich damit selbst weiterkommen würde ich hier vermutlich keine Fragen stellen. Jeder fängt mal an und wenn er niemand findet der ihm ein wenig hilft dann hört er es bald wieder auf (Annahme des Verfassers).
Dieses Dokument laesst immer noch eine Menge moeglicher Alternativen offen. Den XML Bereich habich mir nicht naeher angesehen, aber abgesehen davon kommen da ueberhaupt keine Strings vor. Das ganze laesst sich nach einem zugegebenermassen nur kurzem Ueberflug der Doku, auf die simple 'Formel' reduzieren: Ueber die serielle Schnittstelle kommt 1 Byte rein, was soll damit (abhaengig von dem was vorher empfangen wurde) geschehen? Du kannst dir Variablen machen, in denen du dir den aktuellen Zustand der Uebertragung merken kannst, um zu entscheiden was mit dem naechsten Byte zu geschehen hat bzw. die den aktuellen Zustand modifizieren. Am Anfang ist dein Empfangscode im Zustand 'keine Nachricht' und der Escape Zaehler ist auf 0. Das naechste Byte wird von der Seriellen geholt, wenn eines da ist. Ist es ein 0x1B dann wird der Escape Zaehler um 1 erhoeht. Ist es kein 0x1B dann wird der Zaehler auf 0 gesetzt. Erreicht der Zaehler auf die Art den Wert 4, dann wurde offenbar der Beginn einer Nachricht gefunden und der Empfangscode wechselt in den Zustand 'in einer Nachricht'. Und so geht das eben dahin. 1 Byte wird von der Seriellen geholt und abhaengig vom Zustand und/oder irgendwelchen Zaehlern oder anderen Variablen wird entschieden, was mit dem Byte geschehen soll, bzw wie die Weichen fuer die naechsten Bytes zu stellen sind. Mal dir halt mal ein paar komplette Nachrichten auf, so wie du sie vom Geraet kriegst und entschluessle die Nachricht komplett. Da kriegst du dann ganz schnell ein Gefuehl dafuer, welche Bytes wie das weitere Vorgehen beim Empfang bzw. In der Dekodierung steuern. Aber eines steht fest: mit Strings bzw Stringverarbeitung hat das alles nichts zu tun.
:
Bearbeitet durch User
Hallo Karl Heinz, vielen Dank für den Ansatz. So ungefähr dachte ich mir das auch. Ich habe mir das mal aufgezeichnet was da reinkommt und mir die Zeit genommen die Muster (Bytefolgen) zu kennzeichnen und werde mich jetzt daran machen die gewünschten werte auszulesen. Sicher wird das eine Lösung bei der sich ein Profi die Hände über dem Kopf zusammenschlägt doch besser erst mal eine Lösung die funktioniert dann kann ich immer noch optimieren. So macht das schließlich Microsoft schon bald 30 Jahre sehr erfolgreich ;-)
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.