www.mikrocontroller.net

Forum: Compiler & IDEs string operationen


Autor: Markus Friedrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
sitze seit längerer Zeit an einem eigentlich einfachen Vorhaben - nur
leider kriege ich es nicht hin. :-(
Vielleicht seht ihr ja den Fehler oder habt sogar den ultimativen
Gegenvorschlag.

Die Idee:

- vier globale Variablen für die vier Zeilen meines LCDs
unsigned char line1[15]; //0..15 = 16 chars
unsigned char line2[15];
unsigned char line3[11];
unsigned char line4[11]; //0..11 = 12 chars, erste vier werden von LCD
verschluckt (ist aber anderes Problem)

- einzelne Funktionen ändern die Variablen z.B.
if(init()==1) {
    strcpy(line4, "_ready_");
  } else {
    strcpy(line4, "_error_");
  };

- Endlosschleife der main Routine ruft dann ein updatedisplay() auf
damit sich nach jedem sequentiellen Durchlauf eine komplett geänderte
Anzeige ergibt
void updatedisplay(void)
{
  lcd_clrscr();
  lcd_gotoxy(0,0);
  lcd_print(line1);
...

- meine Printfunktion
void lcd_print(const char *string)
{
  char *chr;
  char buf[15];
  chr = string;

  while (*chr++) {
    strlcat(buf, *chr, 15);
  }
  lcd_puts(buf);
}

Entweder sehe ich gar nichts oder aber nur Datenmüll z.B.:
J_ea__ready_y oder ähnliches.

Bin für jede Idee ausgesprochen dankbar sonst raufe ich mir noch das
letzte Haar!

Gute Nacht,

Markus

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unsigned char line1[15]; //0..15 = 16 chars

Erstens sind das, was Du hier deklariert hast, nur 15 Zeichen (wie's
auch
dasteht), also 0..14 als gültiger Indexbereich.
Zweitens wäre es sinnvoll, gleich ein Byte mehr zu spendieren für ein
abschließendes \0 byte, dann funktionieren alle normalen
Stringoperationen
auf dem Puffer, und man muß nicht explizit jedesmal noch die Anzahl
der
Zeichen mitzählen:

unsigned char line1[17]; /* 0..16 */

Dein lcd_print() ist völlig mysteriös.  Was soll der Unterschied zu
Deinem (offenbar vorhandenen) lcd_puts() sein?

Autor: Markus Friedrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Korrektur meiner arrays!

Die lcd_print Funktion war ein Versuch trotz des scheiterns der
lcd_puts Funktion aus der Peter Fleury lcdlibrary eine Ausgabe zu
erhalten.

die PF-lib hat die folgenden Funktionen:
void lcd_putc(char c);
void lcd_puts(const char *s);
void lcd_puts_p(const char *progmem_s);
#define P(s) ({static const char c[] _attribute_ ((progmem)) =
s;c;})
#define lcd_puts_P(__s)   lcd_puts_p(P(__s))

Ich will aber nicht nur hart codierte Ausgaben wie lcd_putc('x') oder
lcd_puts_P("XYZ"), sondern auch dynamisch erzeugte Strings ausgeben.

Wenn ich nun, wie schon oben angedeutet, versuche mit strcpy(line1,
"Hallo, Welt!") und lcd_puts(line1) eine Ausgabe zu erhalten,
passiert nichts.

Was mach ich falsch - ich glaub ich steh seit Gestern auf der
Leitung?!


Markus

Autor: Peter Fleury (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Markus

Die lcd_puts() funktioniert schon, Du musst sie nur nur wie
dokumentiert einsetzen.

lcd_puts() dient zur Ausgabe EINES strings.

Willst Du einen dynamischen String ausgeben, musst du ihn zuerst
zusammensetzen mit Standart C String funktionen:

char buffer[32];

strcpy( buffer, "Teil1-" );
strcat( buffer, "Teil2" );

lcd_puts( buffer );  -> zeigt "Teil1-Teil2" auf LCD


Bitte neueste Version von meiner lcd-lib herunterladen und Bespiel
test_lcd.c anschauen.
http://www.mysunrise.ch/users/pfleury/avr-software.html

Autor: Markus Friedrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank! Werde ich gleich mal testen...

Autor: Markus Friedrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
geht leider immer noch nicht: LCD bleibt einfach leer. Warum weiß ich
nicht. Meine einzige Idee ist, dass ich zum einen eine ältere lcdlib
verwende (aber neusten avr-gcc [unter linux]) zum anderen sich
irgendetwas mit anderen eingebunden libs beißt.
Werde Morgen mal ein ganz neues Studio Projekt aufmachen, welches nur
die obigen vier Zeilen ausführt; mal schaun was dann passiert.

Autor: Markus Friedrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nach einer Tasse Kaffee funktioniert nun alles wie erwartet.

Es muß also an einer meiner eingebunden libs gelegen haben, ohne dass
gcc den Fehler beim compilieren gemerkt hat.

An was genau poste ich mal, wenn ich es beim Wiedereinbinden finde...

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.