Forum: Mikrocontroller und Digitale Elektronik Aus String Variable lesen und speichern


von Martin S. (drunkenmunky)


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?

von Jonas B. (jibi)


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

von Martin S. (drunkenmunky)


Lesenswert?

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.

von Walter S. (avatar)


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!

von Ralf G. (ralg)


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.

von Karl H. (kbuchegg)


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.

von Martin S. (drunkenmunky)


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.

von Ralf G. (ralg)


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

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.