0

サーバーでhttpリクエストを作成し、httpページのコンテンツを読み取るarduinoプロジェクトに取り組んでいます。ループには関数があります:

String eventValue = check_for_event(); 

String check_for_event(){
if (client.connect(server, 80)) {
    client.print("GET /check_for_event.php?q=");
    client.print(class_code);
    client.println(" HTTP/1.0");
    client.println();

    return readPage(); 

} else{ return "704"; }
}

String readPage(){
  stringPos = 0;
  memset( &inString, 0, 32 );
  int print_flag=0;
  while(true){

    if (client.available()) {
      char c = client.read();
      if (c == '<' ) { 
        startRead = true; 
      }else if(startRead){
        if(c != '>'){ 
          inString[stringPos] = c;
          stringPos ++;
        }else{
          startRead = false;
          client.stop();
          client.flush();
          print_flag=1;
          return inString;
        }

      }
    }

  }
  if(print_flag==0){return "804";}
}

これは私のコードの一部で、3 秒ごとに呼び出します。何時間も問題なく動作しますが、突然クラッシュし、その理由がわかりません。check_for_event 関数のどこかでクラッシュすることがわかりました。

4

1 に答える 1

0

ほとんどの場合、メモリが不足しています。コードを表示しないため、正確な理由を特定するのは困難です。メモリ リークが発生しているか、RAM がオーバーフローしています。受信した http ページのサイズが異なるかどうか、およびクラッシュが特定の大きなページでのみ発生するかどうかを確認することをお勧めします。

RAMが2kしかないArduinoは、http処理には理想的ではありません。Raspiの範囲内の何かがより適切です.

そうは言っても、Arduinoに固執したい場合は、使用するRAMを減らすためのテクニックを検討することをお勧めします. 最初に、使用可能なメモリについて学習します。

次は、文字列定数のためにメモリを浪費するのをやめることです。これで十分でない場合は、コードを調べて、何度も最適化する必要があります。コストの制約が厳しい場合 (たとえば、1000 台のデバイスを設計している場合)、または時間が基本的に自由でない限り、より強力なハードウェアに切り替えることをお勧めします。

于 2013-05-20T07:32:08.693 に答える