Hi! Wenn ich sowas wie uart_puts("Ich bin eine Stringkonstante im RAM!"); schreibe, dann lagert er diesen String ja im Ram aus. Wenn ich den gerne im Rom hätte müsste ich dort extra über char PROGMEM s[] = "Ich bin eine Stringkonstante im ROM!"; uart_puts(&s); // Funktion die über pgm_read_byte() die variable aus dem ROM holt. Geht das auch komfortabler so dass ich sowas wie uart_puts(PROGMEM "balbla") schreiben kann? oder so ähnlich, oder ganz automatisch. lg PoWl
Was du suchst, ist dieses:
1 | uart_puts(PSTR("blabla")); |
Aber weder diese Kurzform, noch deine lange Version, werden funktionieren, wenn uart_puts einen "normalen" String erwartet (also einen, der im RAM steht).
ah, dankeschön das kannte ich noch garnicht. welchen variablentyp muss eine funktion denn dann erwarten? uart_puts_pgm(const uint16_t *string); ?
Paul Hamacher wrote: > welchen variablentyp muss eine funktion denn dann erwarten? > > uart_puts_pgm(const uint16_t *string); ? Nein, das ist keine Frage des Variablentyps. Die Funktion muss den String aus dem Flash lesen, also speziell für Flash-Strings programmiert worden sein.
ich weiß, die funktion muss ich mir schon selbst schreiben, wollte nur wissen was die funktion dann als argument erwartet ;-)
1 | void uart_puts_pgm(char *string) |
2 | {
|
3 | char temp; |
4 | |
5 | while(1) |
6 | {
|
7 | temp = pgm_read_byte(string); |
8 | |
9 | if(temp) |
10 | {
|
11 | uart_putc(temp); |
12 | string++; |
13 | }
|
14 | else
|
15 | {
|
16 | break; |
17 | }
|
18 | }
|
19 | }
|
habs jetzt so, funktioniert prima. Danke! lg PoWl
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.