質問: "0" + sLen; Serial.print("sLen:"); Serial.println(sLen); Serial.flush(); cmd += "@"; cmd += sLen; cmd += str; cmd += "/A"; debugSerial.print("cmd:"); debugSerial.println(cmd); debugSerial.flush(); ``` 出力結果 cmd:@test/A ***追記2 2018/04/19*** グローバル変数で結構な量を配列で定義していたものを一時的に減らした所 正常動作することを確認しました。 どうもこの辺りがあやしいのかもしれません。 ちなみにその時のコンパイル後のメッセージは 最大30720バイトのフラッシュメモリのうち、スケッチが19624バイト(63%)を使っています。 最大2048バイトのRAMのうち、グローバル変数が1166バイト(56%)を使っていて、ローカル変数で882バイト使うことができます。 となっていました。 もうちょっと調べてみようと思います。
回答: メモリリークと言うのはちょっと考えづらいように思います。 ArduinoのStringオブジェクトはかなりプリミティブなものに見受けられ、ご提示のコードのような、基本的な操作ですぐメモリリークを起こすようなものには思えません。 > > 全く同じ文を今作成しているものに組み込むとString(val, base) の結果をprintしても何も表示されません。 > > > とのことですので、ハードウェアに依存した問題のような気がします。シリアル出力の部分で問題が出ているかもしれません。通信速度を遅くしてみたり、出力する文字列を1文字ずつ、更にディレイとSerial.flush()を追加してみたりして、問題点の切り分けをしてみてください。 原因がまた違うところにあれば、更に詳しい別の回答者さんのフォローを私も待ちたいところです。 下のコードは、自作の`printOneByOne`関数で`String`オブジェクトの文字列をひとつずつ出力する例です。通信速度は9.600bpsにして、1文字ずつ、`Serial.flush`して100ミリ秒待機もさせています。これくらいやればいくらなんでも通信用チップの送信用FIFOバッファがあふれるようなことも無いでしょう。 ``` int num; void setup() { // put your setup code here, to run once: Serial.begin(9600); num = 0; } void printOneByOne(String& s) { for (int i = 0; i < s.length(); i++) { Serial.print(s.charAt(i)); Serial.flush(); delay(100); } Serial.println(""); Serial.flush(); } void loop() { // put your main code here, to run repeatedly: num++; Serial.println(num); Serial.flush(); delay(500); String str = "test"; printOneByOne(str); } ``` 上記のコードをArduinoUNOで走らせ、シリアルモニターで確認している様子です。 !イメージ説明 ご参考まで。 **追記しました:** 2018/04/18 11:24 回答した後に質問を見直して気がつきましたが、お使いのものは「Arduino pro mini 3.3V 8MHz」とのことで低電圧で電源供給能力が少し弱いのかもしれません。周辺のハードウェアを色々付けていると影響が無いとも言えません。 ご提示のコードですと`Serial.println`を実行したときに出力されるべき文字列の先頭の方がデータが欠けている様子なので、シリアル出力の立ち上がりに問題が出ているようにも思えます。通信速度を下げると改善するかも、です。(これもあくまで「可能性としてあるかも?」程度の思い付きの意見です) **質問の追記2を受けて更に追記:**2018/04/19 12:34 ローカル変数の領域が残り882バイトですと、スタック領域としてかなり切迫していると思います。 (まぁ、RAMが2048バイトなら仕方が無いですが) どこか、自作のコード部分でメモリを破壊している可能性が高いように思います。 `String`オブジェクトのメモリリークと言うよりは、`String`オブジェクトは恐らく被害者かと。 自作の関数の呼び出しが深くなっていないか、自作の関数の中でローカル(auto)変数を無駄に多く使っていないかなどをチェックして、スタックをなるべく使わないよう工夫してみてください。