-
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
-
Thread
IRMP Atmega168 Signal wird falsch übergeben?
for (;;) { if (irmp_get_data (&irmp_data)) { uart_puts_P (PSTR("protocol: 0x")); itoxx (buf, irmp_data.protocol); uart_puts (buf); #if IRMP_PROTOCOL_NAMES == 1 uart_puts_P (PSTR(" ")); uart_puts_P (pgm_read_word
(PSTR(" flags: 0x")); itoxx (buf, irmp_data.flags); uart_puts (buf); uart_puts_P (PSTR("\r\n")); } } } /*--------------------------------------
-
Thread
AVR strings im flash mit progmem, direkt als argumente an funktionen?
Siehe PSTR in der AVR-Libc
4.7: [c] #include <avr/pgmspace.h> const char * volatile p; int main (void) { p = PSTR ("Hallo"); p = PSTR ("nochmal Hallo"); return 0; }[/c] mit -Os -fmerge-all-constants wird daraus: [avrasm] main: ldi r24,lo8(__c.1515) ldi r25,hi8(__c.1515) sts p+1,r25
-
Thread
c/c++ array in bereits reserviertem Speicher anlegen
preallocateBuffer = malloc(preallocateBufferSize); // Stream-File-Buffer Serial.printf_P(PSTR("Adresse Buffer: %X\n"), preallocateBuffer); Serial.printf_P(PSTR("Buffer reserviert: - Free mem=%d\n"), ESP.getFreeHeap()); titelliste = (char*)preallocateBuffer; for (i=0; i<20; i++) { titelliste[i] = i + 'a'; Serial.printf_P(PSTR("Adresse: %X Wert: %c\n"), titelliste+i, titelliste[i]); } titelliste[i]='\0'; Serial.printf_P(PSTR("Array beschrieben: - Free mem=%d\n"), ESP.getFreeHeap()); Serial.print(titelliste
-
Thread
Zwei gleiche Codeschnipsel = volkommen verschiedene Ergebnisse
Vollständigkeit halber hier noch den Sollbyte-Manipulator [c] else if (strncmp_P(auswertstring,PSTR("east"),4)==0) {volatile extern unsigned char motorsollbyte; setbit(motorsollbyte,0); clearbit(motorsollbyte,1); ausgabefehler = 0;} else if (strncmp_P(auswertstring,PSTR("west"),4)==0) {volatile
motorsollbyte,1); clearbit(motorsollbyte,0); ausgabefehler = 0;} else if (strncmp_P(auswertstring,PSTR("stop"),4)==0) {volatile extern unsigned char motorsollbyte; motorsollbyte = 0x00; ausgabefehler = 0;} else if (strncmp_P(auswertstring,PSTR("up"),2)==0) {volatile extern unsigned char motorsollbyte
-
Thread
va_list an vsprintf() weiterreichen
0' == c) return; if ('%' == c) { ... } void put_PSTR (const char * fmt, ...) { va_list vlist; va_start (vlist, fmt); put_va (fmt, vlist); va_end (vlist); } [/c] Die Format-String muss im Flash liegen. Um nicht jedesmal PSTR
c] #include <avr/pgmspace.h> // mind the blank before the colon! #define put_P(y,z...) put_PSTR (PSTR(y) , ##z) extern void put_PSTR (const char *, ...); [/c]
-
Thread
problem mit string zu float konvertierung und umgekehrt
char c = 0; char buffer[buffersize]; unsigned int dec = 5; clr_screen(); uart_puts_p (PSTR("Koeffizient Y(k-1) = ")); input_string(buffer, buffersize); coeff_y_alt1 = atof(buffer); uart_puts_p (PSTR(" >> Kontrollausgabe: ")); uart_puts(dtostrf(coeff_y_alt1, buffersize, dec, buffer)); uart_puts_p (PSTR("\r\n")); uart_puts_p (PSTR("Koeffizient Y(k-2) = ")); input_string(buffer, buffersize); coeff_y_alt2 = atof(buffer); uart_puts_p (PSTR(" >> Kontrollausgabe: ")); uart_puts(dtostrf
-
Thread
[AVR] compiler optimiert strings nicht richtig
automatically storing string constant in program memory */ #define lcd_puts_P(__s) lcd_puts_p(PSTR(__s)) #define ERROR_SD_READ "Error SD_read" if( 0 != getSDinfos(&sdInfo) ){ lcd_init(LCD_DISP_ON); lcd_puts_P( ERROR_SD_READ ); HALT; } if(0 != SD_readSingleBlock
extern void foo1 (const char*); extern void foo2 (const char*); void foo (void) { foo1 (PSTR ("hallo")); foo2 (PSTR ("hallo")); } [/c] Wird expandiert zu [c] void foo (void) { foo1 ((__extension__({static char __c[] __attribute__((__progmem__)) = ("hallo"); &__c[0];})))
-
Thread
Array mit printf_P als Hexzahlen ausgeben
f16_open(EIBlogStatus.log_datei,"a"); if (logfile) { f16_printf_P(logfile,PSTR("%2i.%2i.%2i;%2i:%2i:%2i;"), TM_DD, TM_MM, TM_YY, TM_hh, TM_mm, TM_ss, Telegramm); for(i=0;i<Length_save+8;i++) f16_printf_P(logfile,PSTR("%x;"),Telegramm[i]); f16_printf_P(logfile,PSTR("\r\n")); f16_close(logfile); } } } [/c]
-
Thread
STK500 Serial Port String senden
usart_init ( MYUBRR ); // dump some strings to the screen at power on usart_pstr("Ready to rock and roll!\n\r"); usart_pstr("Type in a character, and I will transpose it up by 1:\n\r"); // main loop while(true) { // if a key has been pressed, then process
unsigned char b; b=0; if(UCSRA & (1<<RXC)) b=1; return b; } void usart_pstr(char *s) { // loop through entire string while (*s) { usart_putchar(*s); s++; } } [/c]
-
Thread
ARM Cortex-M0: re-enter Interrupt
seconds++; if ( ! (seconds % 60)) { seconds = 0; minutes++; } sersendf_P(PSTR("%su:"), minutes); if (seconds < 10) serial_writechar('0'); sersendf_P(PSTR("%su\n"), seconds); // Be busy sometimes. if ( ! (seconds % 5)) delay_ms(2000); }
seconds++; if ( ! (seconds % 60)) { seconds = 0; minutes++; } sersendf_P(PSTR("%su:"), minutes); if (seconds < 10) serial_writechar('0'); sersendf_P(PSTR("%su\n"), seconds); if ( ! (seconds % 5)) { SCB->ICSR = SCB_ICSR_PENDSVSET_Msk; //
-
Thread
HT16K33 schnelltest LED Blink :P
der ganze block nur zur Sicherheit, um das Device abziehen zu können. lcd_printlc_P(1, 1, PSTR("TEST AN")); lcd_light(true); lcd_printlc_P(2, 1, PSTR("TEST ")); HT16K33_ClearDisplay(0); HT16K33_ClearDisplay(1); HT16K33_ClearDisplay(2); HT16K33_ClearDisplay(3); HT16K33_ClearDisplay(4); wait_10ms(500); lcd_printlc_P(1, 1, PSTR("TEST ")); lcd_light(false); lcd_printlc_P(2, 1, PSTR("TEST AUS")); HT16K33_FillDisplay(0); HT16K33_FillDisplay(1); HT16K33_FillDisplay(2); HT16K33_FillDisplay
-
Thread
avr-gcc: Format für Flash-String-Ausgabe?
Probier mal lieber so. const char *getstring(); Oder teste mal einfach so. sprintf(pBuf, "%S", PSTR("Hello World")); Außerdem bietet sich sprintf_P an, damit sparst du RAM, denn der Formatstring ist ja konstant. > warning: format ‘%S’ expects argument of type ‘wchar_t *’, but argument > 9
if (pTask == NameTable[i].taskAddr) return NameTable[i].name; return PSTR("***"); } [/c]
-
Thread
GPS NMEA Libary für Atmega32
0) while (*p++ != ',') ; // if (strlen(sentence)>=99) { // printf_P(PSTR("sentence zu lang: %d\n%s\n"),strlen(sentence),sentence); // } strncpy (result, p,100); result[99]=0; p = result; while (*p && *p != ',' && *p != '*' && *p != '\r')
chksum[2]=0; csnum=strtol(chksum, NULL, 16); if (csnum!=value) { printf_P(PSTR("NMEA CS ! %s %02x\n"),chksum,value); return; } oldLat = gpspos.lat; oldLon = gpspos.lon; gpspos.lat=atof(readFieldByNumber(data, 2)); d=gpspos.lat/100
-
Thread
#define Konstante in String einbauen
Die Ausgabe [c] #define LCD_CHAR 126 ... // Ausgabe LCD_string_P(PSTR("Zeichen: ")); LCD_data(LCD_CHAR); [/c] könnte ich doch auch so schreiben [c] LCD_string_P(PSTR("Zeichen: \126")); [/c] Kann ich auch beide irgendwie vereinigen (ohne sprintf)? [c] #define LCD_CHAR 126 ... // Ausgabe irgendwie so? LCD_string_P(PSTR("Zeichen: \" LCD_CHAR)); [/c] ??? Danke karl
-
Thread
Einen Flash-String "ganz normal" verwenden
swiftFlashStrBuf; } extern void consolePrintln (char* s); consolePrintln (getSwiftFlashStr (PSTR ("Hallo Welt"))); [/C] ich hoffe, dass das jemand gebrauchen kann. Grüße Ralf
aber was spricht gegen: char swiftFlashStrBuf [21]; consolePrintln (strcpy_P(swiftFlashStrBuf ,PSTR ("Hallo Welt"))); Oliver
-
Thread
ESP8266_NONOS_SDK: Welche Strings im RAM?
h, "tri_tra_trallala", 16) Dann steht "testtesttest" im RAM! Richtig wäre: > strncasecmp(h, PSTR("tri_tra_trallala"), 16) Sowas (ganz allgemein, nicht nur mit strncasecmp, was nur ein Beispiel war) würde ich gerne automatisch finden können.
Tim schrieb im Beitrag #6753318: >> strncasecmp(h, PSTR("tri_tra_trallala"), 16) > > Sowas (ganz allgemein, nicht nur mit strncasecmp, was nur ein Beispiel > war) würde ich gerne automatisch finden können. strncasecmp() wäre hier falsch, richtig
-
Thread
Array vom PROGMEM aufs Display
wie wär's mit PSTR ? [c] #include <avr/pgmspace.h> strcpy_P (buffer, PSTR("TestString")) [/c]
Rainer B. schrieb im Beitrag #4669931: > wie wär's mit PSTR ? Ja danke, das funktioniert. Wie soll da einer draufkommen .... Ich hab es mir vorher im Header-File angeschaut und bin nicht drübergestolpert.
-
Thread
Problem bei negativen Temperaturen mit Temperatursensor DS18S20
Temperatur in String uart_puts(Buffer); // String zur Uart uart_puts_P(PSTR(" Grad Celsius\r\n")); // Ausgabe der Einheit } int main(void){ uart_init(); uart_puts_P(PSTR("\r\nProgrammstart\r\n")); // Startmeldung // Testausgabe siehe Datenblatt
25 Grad Celsius PrintTemp2Uart(0xFF, 0x92); // -55 Grad Celsius uart_puts_P(PSTR("Fertig\r\n")); // Endemeldung for(;;); }[/c] Gruß Rene
-
Thread
ISR-Rücksprungadresse feststellen
char c = uart_getchar(); switch (c) { case 0x1b: uart_puts_P(PSTR("\r\nREBOOT\r\n")); while (1) // reboot ; case '#': // fill SaveArea.stack with text uart_puts_P(PSTR("Text: "));
break; case '~': // print SP uart_puts_P(PSTR("SP = ")); uart_hex_putchar(SPH); uart_hex_putchar(SPL); uart_puts_P(PSTR("\r\n")); break; default:
-
Thread
Zugriff auf Strings im Flash
/* comand description */ PGM_P CmdDescr; }; const struct cmdtab_st cmdtab[] = { { PSTR("help"), PSTR("print help message\r\n")} }; wird nicht uebersetzt, es waeren keine Klammern innerhalb eines Ausdruckes erlaubt. Ich nehme mal an das er die PSTR(..) Anweisungen nicht mag, aber wie
-
Thread
Konstanten im Flash ablegen
nicht global, sondern lokal, jeweils in den Funktionen, in denen ich die Strings benötigt habe, als PSTR deklariert habe. unsigned char szBuf[42]; void xyx() { char *ps1 = PSTR("Hier kommt der String\n"); char *ps2 = PSTR("und hier noch einer\n"); // irgendwelche Befehle strcpy_P (szBuf, ps1
-
Thread
Atmega16 Speicher bald voll Program / Data Unterschied ?
Das geht nicht? struct MenuEntry MainMenu[] PROGMEM = { ... PSTR bringt hier natürlich nichts, ist aber auch nicht nötig, weil char[] statt char*.
Horden von pgm_xxx() Funktionen für jeden Strukturzugriff abkämpfen zu müssen. Jedenfalls in C - PSTR inmitten der Initialisierung ging zumindest in der damaligen avr-gcc Version nur in C, nicht aber in C++.
-
Thread
Ist mein Mega 128 Kaputt
ort.testort,ort.plz,ort.latitude,ort.lontitude); send_UART1(&uartbuffer[0]); besser: send_UART1_P(PSTR("Kennung")); send_UART1(ort.kennung) send_UART1_P(PSTR(" \r\nOrtschaft:")); ... Die SendUART1_P musst evtl neu programmieren, damit sie Konstanten vom pgmspace lesen kannst. ein send_UART1(
int i) schreibt einen Integer an der aktuellen Cursorposition, sieht dann z.B. so aus: lcd_puts_P(PSTR("Wert: ")); lcd_puti(wert); Gruß Roland
-
Thread
Printf und String im Flash
<avr/pgmspace.h> #include <stdio.h> int main(void) { Uart_init(); while(0) { printf(PSTR ("Hallo Welt!")); } } [/c] Gruß, Marian
sagt, dass ein String aus dem Flash kommt printf( "%S", PSTR("Hallo Welt" ) ); (Ich weiss jetzt gar nicht, ob es einen printf_P gibt, der den Format String im Flash erwartet, dann würde das direkt gehen printf_P( PSTR("Hallo Welt" ) ); ) > einen
-
Thread
Ram wird follgeschrieben
outp(*ptr,UDR); break; } } } wenn ich nur den Aufruf: char *line1 = PSTR("1.Test von Florian"); uart_send(line1,18); schreibe, so funktionierts. wenn ich aber char *line1 = PSTR("1.Test von Florian"); uart_send(line1,18); char *line2 = PSTR("2.Test von Florian
-
Thread
PIC Register setzen
; }; struct { unsigned :6; unsigned CMPL0:1; unsigned CMPL1:1; }; } PSTR1CONbits; Microchip arbeitet nicht mit #defines sondern mit Unions und Bitfeldern. #defines sind ja nicht typsicher, weil die ja am Compiler vorbei laufen. Unions und Structs sind typsicher, das checkt der Compiler. Du kannst also nicht nur sagen: PSTR1CON &= ~CMPLMASK; sondern auch PSTR1CONbits.CMPL=0; > Ich könnte auch einige Denkanstöße zu den Problemen gebrauchen. Auch > weil mein Englisch nicht ausgereit hat, um die Funktionen von LATx laut