mikrocontroller.net

Forum: Compiler & IDEs Zeiger auf Element im String


Autor: Phil (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
char stringbuffer[64];

  if (uart_rx_flag==1 && buffer_full==0) {    

    get_string(stringbuffer+2);
    r = atoi( &stringbuffer[2] ); // r für rote LED           
    buffer_full=1;
  }

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

Warum liest er nicht den Char?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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:
 r = stringbuffer[2]; // r für rote LED 

Autor: Phil (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Phil (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Phil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super. Mal wieder ein großes Dankeschöön an dich.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.