Aus String Variable lesen und speichern

OP #2573350
Hi,

ich empfange Daten über UART und speichere die in einem char-Array.
Jetzt würd ich daraus gern Daten lesen und in einer Variable speichern.

Bis jetzt habe ich es so:
1
dutyCycleSoll = (unsigned int)(readArray[2]-0x30) * 100;
2
dutyCycleSoll += (unsigned int)(readArray[3]-0x30) * 10;
3
dutyCycleSoll += (unsigned int)(readArray[4]-0x30);

Gibt es noch eine einfachere Möglichkeit?

Alternativ könnte man die Daten ja nicht mit ASCII Zeichen übertragen, 
sondern als Wert. Man bräuchte dann auch weniger Bytes zum Übertragen.
Aber dann hat man das Problem, dass diese Werte alle Zeichen sein 
können, also z.B. auch ein Carriage Return. Aber solche Steuerzeichen 
braucht man, um den Anfang und Ende des übertragenen Strings zu 
erkennen.

Oder wie macht ihr das?
Also erstmal sind alle übertragenen Bytewerte einfach Werte zwischen 0 
und 255. Was das BS dann daraus macht ist die nächste Sache. Wenn du 
aber sicher bist, das die (Beispiel) nächsten 4 bytes die über die 
serielle Schnittstelle deines MC's(oder auch PC's) kommen einen double 
wert darstellen, musst du sie halt entsprechen interpretieren. Niemand 
hier überträgt einen double Wert als ASCII string, lol :)

Gruß Jonas
OP
ja aber die Frage ist, wie man sich da sicher sein kann, dass es genau 
diese 4 Bytes sind (ohne Steuerzeichen)?

Man könnte vielleicht meherer Steuerzeichen als Anfang des Strings 
nehmen, um die Wahrscheinlichkeit zu minimieren, dass die Werte nicht 
als Steuerzeichen erkannt werden.
Jonas Biensack schrieb:
> das die (Beispiel) nächsten 4 bytes die über die
> serielle Schnittstelle deines MC's(oder auch PC's) kommen einen double
> wert darstellen, musst du sie halt entsprechen interpretieren. Niemand
> hier überträgt einen double Wert als ASCII string, lol :)

von double hat zum einen niemand geschrieben, und zudem:
es könnte sogar die einzige Möglichkeit sein double als ASCII zu 
übertragen,
wenn nämlich die Zahlendarstellung auf beiden Systemen verschieden ist!
Martin S. schrieb:
> Aber solche Steuerzeichen
> braucht man, um den Anfang und Ende des übertragenen Strings zu
> erkennen.

Das hast du_ für _dein Übertragungsprotokoll so festgelegt.
Wenn du beim Protokoll flexibel bist, dann übertrage einfach nur die 
paar Byte für die Zahl. Für Anfangs-/ Endeerkennung muss man sich dann 
natürlich was anderes einfallen lassen. Z.B. konstante Paketgröße.
Martin S. schrieb:

> Gibt es noch eine einfachere Möglichkeit?

atoi() oder ltostr() dafür benutzen.

> Alternativ könnte man die Daten ja nicht mit ASCII Zeichen übertragen,
> sondern als Wert. Man bräuchte dann auch weniger Bytes zum Übertragen.
> Aber dann hat man das Problem, dass diese Werte alle Zeichen sein
> können, also z.B. auch ein Carriage Return. Aber solche Steuerzeichen
> braucht man, um den Anfang und Ende des übertragenen Strings zu
> erkennen.
>
> Oder wie macht ihr das?

Wenn ich nicht in Zeitnot bei der Übertragung bin, mach ich das genau so 
wie du auch. Denn textuelle Übertragung hat einen enormen Vorteil: Man 
kann problemlos Synchronisieren und durch die Textform kann jedes 
x-beliebige Terminalprogramm zum Testen benutzt werden.
OP
Ralf G. schrieb:
> Für Anfangs-/ Endeerkennung muss man sich dann
> natürlich was anderes einfallen lassen. Z.B. konstante Paketgröße.

Flexibel bin ich schon. Aber du musst doch auch bei konstant großen 
Paketen wissen, wann eines anfängt? Wie stellst du des fest? Wenn nach 
längerer Zeit nichts empfangen wurde?

Karl Heinz Buchegger schrieb:
> Wenn ich nicht in Zeitnot bei der Übertragung bin, mach ich das genau so
> wie du auch. Denn textuelle Übertragung hat einen enormen Vorteil: Man
> kann problemlos Synchronisieren und durch die Textform kann jedes
> x-beliebige Terminalprogramm zum Testen benutzt werden.

Ich denk auch dass mit ASCII am sichersten ist. Bei nem guten 
Terminalprogramm kann man aber einstellen als was das Eingegebene 
versendet werden soll, so dass es zum Test auch noch ok ist.
Martin S. schrieb:
> Flexibel bin ich schon. Aber du musst doch auch bei konstant großen
> Paketen wissen, wann eines anfängt? Wie stellst du des fest? Wenn nach
> längerer Zeit nichts empfangen wurde?

Da heißt das Zauberwort 'MPCM': am Anfang eines Paketes steht eine 
Adresse und mit setzten des TCB8-Bits wird diese als solche 
gekennzeichnet. Kann man auch für nur zwei µC verwenden, ist dann eben 
nicht so richtig 'multi'.

Z.B.:
Byte1: Empfängeradresse
Byte2: Paketgröße
Byte3: Senderadresse
Byte4 und folgende:
       Daten

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.