-
Thread
sprintf_P & PSTR
mehreren Beispielprogrammen habe ich folgendes Konstrukt gefunden: [c]sprintf_P( tctpbuffer , PSTR("Testnachricht"));[/c] Was genau macht die Funktion sprintf_P und wofür ist die Funktion PSTR? Habe schon ein wenig gegoogled aber leider bin ich nicht recht fündig geworden... Vielen Dank
Den Speicher im Flash brauchts beide Male, nur das RAM wird durch den Progmem-Kram (..._P und PSTR) nicht so sehr belastet.
-
Thread
Strings im oberen Flash-Bereich (> 64K)
die normalen "_p"-Funktionen sind dann ja nicht anwendbar, bzw. Konstrukte der Art "PutTextOnLCD(PSTR("blablah"));", da ja schon das PSTR-Makro nur bis 64K geht. Ich hatte vor längerer Zeit lange herumgebastelt, um dafür eine Lösung zu finden, und ich fand folgendes heraus: #define PSTRX(s) (_
pgm_read_byte_far(s); .. } // Verwendung: PutTextOnLCD(PSTRX("Hallo!")); Ich hatte also ein eigenes PSTR-Makro gebastelt, das hier PSTRX ("X" für "eXtended") heißt. PSTR und PSTRX machen ja nichts anderes, als daß sie einen String unter einem nach außen unbekannten Namen im Flash ablegen und dessen
-
Thread
Umgeschriebene Funktion funktioniert nicht
*dest++ = *src++; ++len; } else { ++src; if(strncasecmp_P(src,PSTR("TIME"),4)==0) { sprintf_P(dest, PSTR("%2.2d:%2.2d:%2.2d"), Time.Hour, Time.Minute, Time.Second); src += 4; } else { // nix gefunden -> '%' speichern
hier funktioniert nicht: [c] uint8_t checkString(char* src, char* dest) { if(strncasecmp_P(src,PSTR("TIME"),4)==0) { sprintf_P(dest, PSTR("%2.2d:%2.2d:%2.2d"), Time.Hour, Time.Minute, Time.Second); return 4; } else if(*src == '%') { *dest = '%'; return 1; } return
-
Thread
ATmega128 RS232 Komunikation
Enable interrupts sei(); //---------------End of Initalisation--------------- printf_P(PSTR("...")); printf_P(PSTR("Running")); printf_P(PSTR("BaudRateRegister set to %u\n"),BaudRateRegister); printf_P(PSTR("Wait")); //Start of infinate while loop while(1){ if (bufferflag == 1){ printf_P(PSTR("Got instruction")); bufferflag = 0; //Reset the buffer flag to say its been processed bufferlocation =0; //Restart the buffer location } } //End of infinate while loop
-
Thread
Stackproblem ATMEGA128 und GCC
// hier die EIGENTLICHE Funktion, ist aber auskommentiert sprintf_P(cString,PSTR("\n%d Zeichen gelesen"),uiCounter); LCD240_PutString (cString); sn=SP; // Stackpointer nachher merken sprintf_P (cString,PSTR("\nStackDiff: %d Byte"),sn-sv
wieder reinnehmen sn=SP; // Stackpointer nachher merken sprintf_P(cString,PSTR("\n%d Zeichen gelesen"),uiCounter); LCD240_PutString (cString); sprintf_P (cString,PSTR("\nStackDiff: %d Byte"),sn-sv); LCD240_PutString (cString); } break
-
Thread
Umlaute und Sonderzeichen auf GLCD zeichnen
zwei Punkten, das ein ä sein soll, von Hand zeichnen? Nur wie binde ich das nun ein? ks0108Puts_P(PSTR("Gerät")); will nicht funktionieren, jedenfalls wird das ä nicht dargestellt. Und wenn ich schon mal dabei bin: Wie funktioniert das mit Sonderzeichen? Z.B. wenn ich bei 0x80 das Zeichen "<->" erstelle
geht nur bis 0x7F. Daran könnte es liegen! ;) Erweitertes ASCII... Und der Befehl ks0108Puts_P(PSTR("Gerät")); wird dann im AVR-Studio 4 mit der letzten WinAVR-Version funktionieren und auch ein ä darstellen? Werde es heute Nachmittag mal ausprobieren und berichten. Schon mal besten Dank! Henry
-
Thread
avr-gcc progmem immer noch?
(a) (*a) #define flash #define PSTR(a) (a) #define strlen_P strlen #define strncpy_P strncpy #define snprintf_P _snprintf // _snprintf nicht ganz kompatibel zu #define snprintf _snprintf // snprintf, aber hier reicht
String direkt (ohne eine Variable erstellen zu müssen) im Flash abzulegen, also ein Äquivalent zum PSTR() Makro? Edit: Auch ich hätte wohl erstmal genau gucken sollen. Die Antwort findet sich im Wiki und lautet: FSTR(), wobei es trotzdem noch einmal Unterschiede zu PSTR() gibt. So ganz einschätzen
-
Thread
Text senden über UART im Interruptbetrieb
ausgangspuffer char *outbufferpos=&outbuffer[0]; //positionszeiger void send(char * pstr){ while ((1<<TXCIE0)& UCSR0B); //warten bis Senderoutine fertig ist outbufferpos=&outbuffer[0]; //Zeiger auf Anfang setzen while (*pstr!=0x00){ //prüfe auf String Ende *outbufferpos = *pstr; //kopiere Zeichen outbufferpos++; //zeiger incrementieren pstr++; } *outbufferpos=0x00; //String-Ende in Puffer schreiben outbufferpos=&outbuffer[0];
-
Thread
struct mit strings im flash unterbringen
ganz intuitiv ohne große Tests: müsste es nicht auch so gehen? bef_struct bef_tab[] = { {PSTR("led"), led}, {PSTR("?"), help}, {PSTR(""), NULL} Um Antwort eines wissenden wird gebenten!!!
die oben genannte parat gehabt (was soviel heisst wie: es gibt keine andere). Bei Verwendung von PSTR kommen u.a. folgende Fehler: test.c:299: error: braced-group within expression allowed only inside a function test.c:299: error: initializer element is not constant Ohne PSTR und PROGMEM direkt
-
Thread
Teilstring mit Konstante vergleichen
schon echt Einiges versucht wie ihr euch vorstellen könnt. Bis hin zu: [C] if (!strncasecmp(DS1, PSTR("OUT1"), 4)){...oder if (!strncasecmp(DS1, PSTR("OUT1\0"), 4)){... [/C] war alles dabei. Ich danke euch sehr für Hilfe.
html_node/Finding-Tokens-in-a-String.html RAM/Flash Verwirrung? Oben steht an einigen Stellen PSTR. Das Gegenstück muss dazu passen.
-
Thread
Linux Uart AVR
"); [/c] oder bessere Lösung (verbraucht weniger Ram, da Konstante im Flash) [c] uart_puts_P(PSTR("Hallo Linux\n")); [/c] (Weitere Infos stehen irgendwo im Tutorial zu Konstanten im Flash) 2. Fehlerquelle: Sind die Fuses richtig gesetzt? Falls du da noch nix dran geändert hast, stehen die
pfleury__uart.html#ga18 stimmt, hier ist "uart_puts_P(...)" (großes P) ein Makro das "uart_puts_p(PSTR(...))" (kleines p) ausführt und hier ist dann auch das von mir erwähnte PSTR drin. übrigens mit lsof -n | grep tty sieht man schnell, welche Prozesse ein tty geöffnet haben Gruß Roland
-
Thread
avr-gcc wie gehts richtig mit PSTR
MAX_BL); sprintf_P(s_out_str, "hellxx (%d)-(%d)", MIN_BL, MAX_BL); oder sprintf_P(s_out_str, PSTR("hellxx (%d)-(%d)"), MIN_BL, MAX_BL); oder sprintf(s_out_str, PSTR("hellxx (%d)-(%d)"), MIN_BL, MAX_BL); ??? welche Version ist richtig, funktioniert und spart SRAM? Ich versuche alle Möglichkeiten
Maximum von 30.720 Bytes) Falls du hoffst Flash zu sparen mit der Verwendung oder dem Weglassen von PSTR, dann geht das natürlich nicht. Der String muss in jedem Fall im Flash gespeichert werden. Mit PSTR kann man nur verhindern, dass er nicht _zusätzlich_ noch im SRAM liegt.
-
Thread
String im Flash
lcd_ausgabe(1,ausgabetext); _delay_s(1); lcd_ausgabe(2,Text); _delay_s(1); strcpy_P(ausgabetext,PSTR("blubb")); lcd_ausgabe(1,ausgabetext); _delay_s(1); lcd_ausgabe(2,PSTR("blubbb")); _delay_s(1); lcd_ausgabe(2,"blubbb"); while (1) //Endlosschleife, damit das Programm nicht beendet
(c); } }/* lcd_puts_p */ [/c] lcd.h: [c] #define lcd_puts_P(__s) lcd_puts_p(PSTR(__s)) [/c] Das benutze ich so: [c] lcd_puts_P("TESTSTRING"); [/c] Bei Fragen nochmal fragen
-
Thread
Software-Datenflusssteurung über RS232
* pucCh = &pcStrOrder[ strlen(pcStrOrder) ]; strcpy(gcaStr, pcStrOrder); strcpy_P(gcaNumStr, PSTR(",")); //HILFSWEISE gcaNumStr für "," if( (pStrTok = strtok_r( pcStrOrder, gcaNumStr , &pucCh)) != NULL)//Trenne CMD, von ID, -"$$$1,CMD { strcpy(gsCmd.ucaCmd, pStrTok); } else {
Und dann TO Float }; }; --------------- Befehlsliste if( !strcasecmp_P( gsCmd.ucaCmd, PSTR("PING")) ) { Print_PStrCR( PSTR("PONG") ); return; }; -----
-
Thread
#define Ich bekomme ein Makro nicht hin.
\r",84, 84);[/c] Also irgendwas im Stile von: [c]#define my_printf( bla bla tiny_printf(PSTR( bla bla[/c] ... eben ohne das lästige PSTR( ... und das schlimme: die schließende Klammer nach dem String. Bin ich zu dämlich oder geht das wirklich nicht ?
[c]#define my_printf(str,...) (tiny_printf(PSTR(str) , ## __VA_ARGS__))[/c] Der Trick mit dem ", ##" funktioniert nur im GCC, bewirkt aber dass der Aufruf auch mit 0 Argumenten funktioniert, siehe: https://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html
-
Thread
c++ Überladung für Pointer auf Flash
als auch auf Ram aufgelöst und separat behandelt werden können. Z.B. so: Uart << "TextImRam" << PSTR("TextImFlash"); Wahrscheinlich geht das nicht, da ja letztendlich beide Pointer gleich aussehen (word auf die Adresse). Wenn ich aber den << Operator wie folgt deklariere: CUart& operator << (
(z.B. Uart << (flChar_t)PSTR("TextImFlash");) Gibt es vielleicht doch eine halbwegs elegante Lösung für dieses Problem?
-
Thread
TWI bei mega644 läuft nicht
1<<TWEA) | (1<<TWIE); //Global Interrupt off lcd_set_cursor(0,LINE0); lcd_puts_p(small_font,PSTR("Slave init rdy")); //Kommt } void twi_get_data(void) { lcd_set_cursor(0,LINE1); lcd_puts_p(small_font,PSTR("Wait for rqst")); //Kommt while(!(TWCR & (1<<TWINT))); //Warten bis der
lcd_set_cursor(0,LINE3); lcd_puts_p(small_font,PSTR("DATA OKAY")); // Kommt } TWCR |= (1<<TWINT); lcd_set_cursor(0,LINE4); lcd_puts_p(small_font,PSTR("Get Data rdy")); //Kommt } ISR (TWI_vect) { twi_get_data(); } [/c]
-
Thread
Eclipse: was bedeutet diese Fehlermeldung?
*p; } char get_4 (char **p) { return **p; } int main (void) { return a + pstr[2] + l[1]; }[/c] Wieviel Aufwand wäre das für die avr-libc? [c]#ifndef _PGM #define _PGM const #endif #define printf_P(FMT,x...) __printf_P((_PGM char*)FMT , ##x)[/c] Die Implementierung
__pgm char * get_pstr (void) { return (const __pgm char*) PSTR ("abc"); }[/c] Die eine Variante funktioniert nur ausserhalb von Funktionen, die andere nur innerhalb. > Wenn es sich darauf herunterbrechen ließe
-
Thread
HC-SR04________
< ICIE1); TCCR1B |= (1 << CS10); } ISR(TIMER1_CAPT_vect){ lcd_gotoxy(10,0); lcd_puts_p(PSTR(" ")); TCCR1B &= ~(1 << CS10); TIMSK1 &= ~(1 << ICIE1); } ISR(TIMER1_OVF_vect){ TIMSK &= ~(1 << ICIE1); lcd_gotoxy(10,0); lcd_puts_p(PSTR("Timeout! ")); } void setUpAvr
set sleepmode set_sleep_mode(SLEEP_MODE_IDLE); // init display lcd_init(); lcd_puts_p(PSTR("Distance: ")); } /* main.c end */ /* main.h beginn */ #ifndef main_h #define main_h #ifndef F_CPU #define F_CPU 1000000UL #endif #include <avr/io.h> #include <avr/sleep.h>
-
Thread
AVR-NET-IO mit ATmega644
Schau mal in die Datei "apps/modules/cmd_adc.c" nach folgendem Codefragment: [c] /* printf_P( PSTR( "<HTML>" "<HEAD>" "<TITLE>ADC</TITLE>" "</HEAD>" "<BODY>" ));*/ cgi_PrintHttpheaderStart(); printf_P( PSTR( "<table border=\"0\" cellpadding=\"5\"
); */ printf_P( PSTR( "<table border=\"0\" cellpadding=\"5\" cellspacing=\"0\">" ) ); [/c] Damit wird die Seite alle 30 Sekunden neu geladen. Ich werte deinen Vorschlag mal als Wunsch und habe es auch schon eingepflegt
-
Thread
string vergleichen
mein vergleich funktioniert aber nicht. was mache ich falsch mfg [c] if(!strcmp_P(pname,PSTR("clear")) ) { Lcd_clear(): } [/c]
funktioniert bei beiden Vergleichen nicht. kann mir jemand weitethelfen [c] if(!strcmp_P(pname,PSTR("Lcd loeschen=")) ) { Lcd_print(pname): } if(!strcmp_P(pname,PSTR("Lcd loeschen=")) ) { Lcd_print(pname): } [/c]
-
Thread
STM32 ADC sättigt zu früh
ADC_Cmd(ADC1,ENABLE); ADC_SoftwareStartConvCmd(ADC1,ENABLE); adc_calib(ADC1); printf_P(PSTR("\fADC Test Poti 1 \n\a")); // Kann als Dauerschleife angesehen werden while(!key_getstroke()) { value = ADC_GetConversionValue(ADC1); glcd_setpos(128); printf_P(PSTR("val=%6i\a"),value); delay_us(100); } printf_P(PSTR("\b\b\b\bdone. \a")); return; error: printf_P(PSTR("\nError \a")); while(!key_getstroke()); } // end function [/c] Erläuterung: - key_getstroke() liefert immer 0 zurück
-
Thread
Instanz von class/struct im Flash ablegen
FunctionToCall)(); > }; > > const UartCommand0P b = { "1", nullptr}; Das Problem dürfte eher PSTR sein, das in C++ nicht funktioniert.
Programm betreffen. >> const UartCommand0P b = { "1", nullptr}; > > Das Problem dürfte eher PSTR sein, das in C++ nicht funktioniert. In C geht das auch nicht da PSTR nicht in einer Funktion steht. Zumindest lässt die Fehlermeldung darauf schießen, daß das nicht-compilierbare Codegeschnippsel
-
Thread
Sprechende Lampe
, 80)) { display.scroll_up(8,20); display.draw_string_P(0,24,PSTR("Connected")); display.display(); // Sent HTTP request client.print(F("GET / HTTP/1.1\r\nHost: ")); client.print(SERVER); client.print(F("\r\nConnection
foundDate) { display.scroll_up(8,20); display.draw_string_P(0,24,PSTR("No date received")); display.display(); } } else { display.scroll_up(8,20); display.draw_string_P(0,24,PSTR("Failed")); display.display