Forum: Compiler & IDEs Zeiger auf Element im String


von Phil (Gast)


Lesenswert?

Hallo,

ich versuche momentan ein einzelnes Element aus einem String zu lesen 
und den Wert einer LED zu zuweisen.

Ein ASCII Code könnte z.b. so gesendet werden : '0','A','Z'

Dabei ist der erste Wert der Helligkeitswert "48" dec der ersten LED und 
der zweite der der zweiten LED usw...

Nun habe ich den UART Code aus dem Tutorial wie folgt verändert:
1
char stringbuffer[64];
2
3
  if (uart_rx_flag==1 && buffer_full==0) {    
4
5
    get_string(stringbuffer+2);
6
    r = atoi( &stringbuffer[2] ); // r für rote LED           
7
    buffer_full=1;
8
  }

Die Strings werden gesendet. Erfolgreich Nachgerpüft. Die ersten beiden 
Chars im Stringbuffer sind reserviert.

Warum liest er nicht den Char?

von Stefan E. (sternst)


Lesenswert?

Was sollte denn atoi mit einem 'Z' anfangen? Für atoi sind nur Ziffern 
relevant. Da du aber ja eh direkt den ASCII-Wert haben willst, ist die 
"Wandlung" extrem einfach:
1
 r = stringbuffer[2]; // r für rote LED

von Phil (Gast)


Lesenswert?

Dann hab ich was glaube ich nicht ganz verstanden. Also wenn ich aus 
einem char Array chars lesen möchte. Kann ich einfach das Elemnt 
übergeben.

Dann versteh ich nicht, warum alle immer sagen vonwegen ascii to integer 
und so.

z.B. hier: Beitrag "Umwandlung eines Char-Arrays in eine Zahl"

Ich versteh nicht, was ich nicht verstehe...

von Karl H. (kbuchegg)


Lesenswert?

Phil schrieb:
> Dann hab ich was glaube ich nicht ganz verstanden. Also wenn ich aus
> einem char Array chars lesen möchte. Kann ich einfach das Elemnt
> übergeben.
>
> Dann versteh ich nicht, warum alle immer sagen vonwegen ascii to integer
> und so.
>
> z.B. hier: Beitrag "Umwandlung eines Char-Arrays in eine Zahl"
>
> Ich versteh nicht, was ich nicht verstehe...

Das was du hast, ist im Grunde ja kein Text, sondern einfach nur Bytes.

Hättest du den Text "LED0=123"
dann würdest du atoi nehmen, um aus dem Text die Zahl 123 zu 
extrahieren.

Den Fall hast du aber nicht. Deine Bytes codieren direkt den Wert.

Übrigens:
  Wenn du da binäre Übertragung machst, wirst du mit speziellen Werten
  Probleme bekommen. Darüber solltest du noch einmal nachdenken. Wie
  codierst du zb. den Helligkeitswert 0?

Hintergrund: In deinem 'Text' ist das dann ein 0-Byte. Nur ist bei 
Strings definiert, dass eine 0 einen String abschliesst. Man sollte sich 
daher immer im klaren sein, wass denn die Bytes darstellen, die man da 
hat. Sind diese Bytes Zeichen im Sinne von ASCII Zeichen, die einen Text 
ergeben, oder sind das einfach nur Bytes, bei denen jeder Wert vorkommen 
kann. Auch wenn man eine zeitlang damit durchkommt, Bytes als Text 
anzusehen, irgendwann läuft man immer in Schwierigkeiten wenn man 
Stringfunktionen auf Bytesequenzen anwendet, die keine Texte sind.

von Karl H. (kbuchegg)


Lesenswert?

Phil schrieb:
> Dann hab ich was glaube ich nicht ganz verstanden. Also wenn ich aus
> einem char Array chars lesen möchte.

Ich denke, deine Verständnisschwierigkeiten rühren daher, dass du denkst 
ein char wäre für den µC irgendetwas besonderes.
Im µC drinnen gibt es keine Zeichen. Alles in einem µC ist einfach nur 
eine Zahl. Erst die Interpretation bestimmt, als was diese Zahl 
angesehen wird.
Wenn du dir die Zahl als Zahl anzeigen lässt, dann wird 48 als "48" 
ausgegeben. Lässt du dir dieselbe Zahl als Character ausgeben, dann 
zeigt die Anzeige dafür eine '0' an. Stösst der µC im Zuge der 
Programmausführung auf diese 48, dann interpretiert er diese 48 als 
irgendeinen Befehl (müsste man jetzt im Datenblatt nachsehen, welcher 
Befehl mit dieser ahl codiert wird).

von Phil (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Wenn du da binäre Übertragung machst, wirst du mit speziellen Werten
>
>   Probleme bekommen

Welcher Wert ausser 0 soll denn noch problematisch werden?!

Karl heinz Buchegger schrieb:
> Auch wenn man eine zeitlang damit durchkommt, Bytes als Text
>
> anzusehen, irgendwann läuft man immer in Schwierigkeiten wenn man
>
> Stringfunktionen auf Bytesequenzen anwendet, die keine Texte sind.

In meinem momentanen Projekt "reicht" es für 3 LEDs Werte zu übergeben. 
da könnt ich ja 2 Werte pro LED nehmen und mir was hübsches für den 0 - 
Fall einfallen lassen. Von wegen wenn Array[0]==1 LED1=aus // wenn 
Array[0]== 2 LED1=Array[1] oder so....

Aber rein aus Interesse. Wie würde ich das dann umgehen? Texte 
rausschicken mit "LED1=0" "LED2=125" "LED3=255" und dann jeden string 
auswerten mit compare und dann die Zahl mit atoi raussaugen??

von Karl H. (kbuchegg)


Lesenswert?

Phil schrieb:
> Karl heinz Buchegger schrieb:
>> Wenn du da binäre Übertragung machst, wirst du mit speziellen Werten
>>
>>   Probleme bekommen
>
> Welcher Wert ausser 0 soll denn noch problematisch werden?!

zb alle die als Steuerbytes übertragen werden :-)

Wenn dein Empfänger die Synchronität verliert, woher weißt du bei
'0' '0' '0' '0'
welche '0' jetzt was bedeutet?


> Aber rein aus Interesse. Wie würde ich das dann umgehen? Texte
> rausschicken mit "LED1=0" "LED2=125" "LED3=255" und dann jeden string
> auswerten mit compare und dann die Zahl mit atoi raussaugen??

Ja. Nimm aber noch ein Zeichen mit dazu, welches dir anzeigt 'Hier ist 
der String zu Ende'. Zb ein Zeilenvorschub würde die Aufgabe gut 
erledigen. ';' ist auch sehr beliebt

von Phil (Gast)


Lesenswert?

Super. Mal wieder ein großes Dankeschöön an dich.

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.