2016-05-17 1 views
0

私の趣味のarduinoプロジェクトでは、私は動的メモリ空間を節約するためにPROGMEMを使用しています。sprintf_Pでpgm_read_wordを使用してください。

私はconstの文字を構築し、配列表にそれらを保存します:

const char KEY[] PROGMEM= "z4PhNX7vuL3xVChQ1m2AB9Yg5....."; 
. 
. 
const char * const MARRAY[7] PROGMEM = 
{APN,URL,API,KEY,ACTION,TIMEZONE,IDENT,}; 

は、今私はsnpritf_P内の文字列を使用したいのですが、このコードは文句を言わない期待どおりに動作:

char * ptr = (char*) pgm_read_word(&MARRAY[0]); 
snprintf_P(conv, sizeof(conv), PSTR("AT+SAPBR=3,1,\"APN\",\"%s\""), ptr); 

文字列を作成してその文字列にcharをコピーすると、次のように動作します。

char * ptr = (char*) pgm_read_word(&MARRAY[0]); 
String buffer [80]; 
strcpy_P (buffer, ptr); 
snprintf_P(conv, sizeof(conv), PSTR("AT+SAPBR=3,1,\"APN\",\"%s\""), buffer); 

最初のコードが機能しない理由を私は本当に理解していませんsnprintfは、私が知る限り、通常の文字をまで期待していますか?

ヒント/助けがよかったですが、私は既にArduino PROGMEM Reference を読んでいますが、まだ理解していません。オーストリア

答えて

0

から

乾杯あなたはフォーマット文字列がPROGMEMから読み取ることができるようにsnprintf_Pを使用して正しいです。ただし、フォーマット文字列に%sが含まれている場合、対応する引数はフラッシュメモリではなくRAMになければなりません。文字列引数は、フラッシュメモリである、あなたは資本Sで、フォーマット文字列で%Sを使用しなければならないことを指定するには

snprintf_P(conv, sizeof(conv), PSTR("AT+SAPBR=3,1,\"APN\",\"%S\""), ptr); 

これはAVRのlibcライブラリのユニークな特徴であるが、hereを文書化。

+0

ありがとう、魅力のように動作し、私にバッファ変数を保存します。ダイナミックメモリの10%を節約できました。まだ多くを節約する必要がありますが、それは良いスタートです。 :) 再度、感謝します! –

関連する問題