string operationen

Gast #40513
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
Gast #40514
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?
Gast #40515
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
Gast #40516
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
Gast #40518
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.
Gast #40519
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren