www.mikrocontroller.net

Forum: Compiler & IDEs Stringpointer


Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich bin gerade dabei mein GLCD in Betrieb zunehmen. Ich wollte mir ein
universal GLCD Modul bauen. Dieses Modul sollte die Moeglichkeit das
Display per SPI, TWI , RS232/USB anzusteueren.

Ich hab die Peter Fleury USART als Vorbild genommen. Ich bin gerade
dabei die SPI Anbindung vorzunehmen. Ein Ringerbuffer für die SPI Daten
hab ich soweit fertig.

Jetzt kommt der schwierige Part. Die Verwaltung der Commando Code's
bzw Verarbeitung der Display Daten.

Ich hab zum testen ein kleines unsigned Char Array generiert. Ich frage
in diesen Array das erste Feld ab und ordne diesen den Befehlen zu.

Dieses funktioniert auch , vielleicht nicht super professionell , aber
es erfuellt erstmal den Zweck.

Ich haenge jetzt ein bischen bei der Funktion Strings auf Display
zugeben.

Die normale Stringausgabe funktioniert über ein Pointer der auf das
akutelle Element zeigt.
Mein Problem liegt darin mein unsigned Char Array zusplitten.

Beispiel:

unsigned char SPIDATA[20];

// SPI DATA[0] == Command (0x00 = Displaydata, 0x01 == LCD_clear) usw.



Wie kriege ich jetzt den Stringzeiger dazu auf das zweite Element vom
Array zustarten ? Also anstatt von SPIDATA[0] von SPIDATA[1] ?

Ich würde mich über eine Antwort freuen.

Mfg
Dirk

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
char *pPointer=&SPIDATA[1];

das sollte das tun...wenn ich das richtig verstanden hab was du
willst...

73 de oe6jwf / hans

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
char *pPointer=&SPIDATA[1];

ist äquivalent zu

char *pPointer = SPIDATA + 1;

Stilistisch sei anzumerken, daß sich die Konvention eingebürgert hat,
nur Präprozessor-Makros in Großbuchstaben zu schreiben.

SPIDATA sollte also kleingeschrieben werden.


Hilfreich wäre es allerdings, wenn Dirk sich seine Frage (oder was er
dafür hält) nochmal durchliest und etwas überarbeitet ...

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

vielen Dank. Trotz mehrfachen durchlesen meiner Frage finde ich kein
Fehler in der Fragestellung.

Ich werde es heute abend mal testen.

mfg
Dirk

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lies Dir diese Sätze nochmal durch:

"Ich frage in diesen Array das erste Feld ab und ordne diesen den
Befehlen zu. "

Was magst Du damit meinen?

"Wie kriege ich jetzt den Stringzeiger dazu auf das zweite Element
vom
Array zustarten ? Also anstatt von SPIDATA[0] von SPIDATA[1] ?"

Was willst Du damit ausdrücken?

(ich will ja gar nicht auf Rechtschreibfehlern oder sowas 'rumreiten,
sondern einfach nur verstehen, was Du versuchst, uns zu fragen)

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

hm ich hab echt starke Probleme mein Problem in Worte zufassen.

>"Ich frage in diesen Array das erste Feld ab und ordne diesen den
>Befehlen zu. "

>Was magst Du damit meinen?

void zuordnung(void)
{
  switch(spidata[0])
  {
  case 1: LCD_clear();
          break;
  case 2: LCD_home();
          break;
  case 3: // hier muesste der Zeiger auf spidata[1] erhoeht werden
          // damit die Zeichen ausgegeben werden.
          LCD_puts(s);
          break;
  //usw.
  }
}


So hatte ich mir die Zuordnung vorgestellt. Der SPI Master sendet die
Befehlsfolge z.B. 0x1F(startbyte) , 0x03(Command) , 0xFF (Data) , 0xFA
(Data), 0x10 (Data), 0x3F (Endbyte).

Falls jemand einen anderen Loesungansatz hat bin ich nicht abgeneigt
auch diesen zunutzen.

Mfg
Dirk

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aaaah, damit wird die Sache doch schon verständlicher.

void zuordnung(void)
{
  switch(spidata[0])
  {
  // ... dinge weggelassen
  case 3: // hier muesste der Zeiger auf spidata[1] erhoeht werden
          // damit die Zeichen ausgegeben werden.
          LCD_puts(spidata + 1);
          break;
  //usw.
  }

Das funktioniert, wenn bei spidata[1] ein nullterminierter String
beginnt, also beispielsweise
spidata[0] = 0x3;
spidata[1] = 'A';
spidata[2] = 'h';
spidata[3] = 'a';
spidata[4] = 0;

führt dazu, daß "Aha" aufs LC-Display ausgegeben wird.

Allerdings versinkt das Verstehen bereits wieder im Nebel:
"Der SPI Master sendet die Befehlsfolge z.B. 0x1F(startbyte) ,
0x03(Command) , 0xFF (Data) , 0xFA (Data), 0x10 (Data), 0x3F (Endbyte).
"

Bedeutet das, daß diese Daten in der Reihenfolge in spidata[] abgelegt
sind?

Dann würde der "String" "\xFF\xFA\x10\x3F ..." (ohne
abschließende Null!) an LCD_puts übergeben werden, was mehrere seltsame
Zeichen auf dem Display zur Folge haben dürfte.

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

>Bedeutet das, daß diese Daten in der Reihenfolge in spidata[]
>abgelegt sind?

Jip. Die Daten sollten in dieser Reihenfolge im SPI Buffer stehen.

>Dann würde der "String" "\xFF\xFA\x10\x3F ..." (ohne
>abschließende Null!) an LCD_puts übergeben werden, was mehrere
>seltsame Zeichen auf dem Display zur Folge haben dürfte.

Ok. Die Daten muesste ich vorher noch in Ascii umwandeln und zum
Schluss terminieren ('0' anhaengen).

Ich hatte mir das wohl doch zu simpel gedacht.

Mfg

Dirk

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.