Aus String Variable lesen und speichern

OP #2573350
Lesenswert?

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?
#2573364
Lesenswert?

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
#2573434
Lesenswert?

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!
#2573455
Lesenswert?

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.
#2573478
Lesenswert?

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 #2573944
Lesenswert?

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.
#2574026
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren