0

このチュートリアルに従って、wifiシールドファームウェアをリセットしました。正しく行わないと、後でエラーが発生する可能性がありますか?

編集2

どこに問題があるのか​​ 、まだわかりません。だから私は.ino file ここに入れました。(コンパイル済み: 25.052 バイト)

別の環境で動作しているかどうかを確認し、レポートしていただけると幸いです。センサーを偽の値に置き換えたので、ハードウェアを追加する必要はありません。スケッチの上にルーターの ssid とパスワードを追加するだけです。

SD カードの部分をコメントアウトすると、もう少し実行されていることがわかります。しかし、一般的には変わりません。Udo Klein が SRAM に言及したように、その動作はリソースが不足しているように見えます。

私が正しく理解しているかどうかを確認するために:

  • コードが少ないほど、空きフラッシュ メモリが増えます。しかし、それは SRAM で実行中のプログラムに影響を与えるべきではありませんね。--> しかし、一部のコード部分 (SD カードなど) がコメント化されていると、なぜ異なる動作になるのでしょうか?

  • 多くの変数を保存すると、空き SRAM の量が減少します。(その後、MemoryFree.h lib によって表示されるはずです --> const ~6kB free と表示されます)

  • 関数から「戻る」たびに、必要なスタックメモリサイズが減少し、ローカルで定義された関数変数は、それ自体のデスクタクタを呼び出しますか?

ループごとに増加しているが関数呼び出しの最後に参照を失うヒープメモリに保存された値はありますか?

編集

昨日と同じコードを実行するだけで、2 回動作していました (-> プログラムが実行されている限り、継続的に http リクエストを作成し、メインの loop() メソッドに戻りました)。再起動でできました!

その理由は、ここに示されているコード ロジック内だけではないようです。私が探すことができるアイデアはありますか?値を上書きする代わりに変数を再定義できますか?


Arduino Mega 2560 の Wifi シールド用の私の C コードは、センサー データを読み取り、HTTP 要求を行う必要があります。次に、両方の結果を SD カードに出力します。

問題:

[1]から呼び出されたネットワーク要求を担当する関数は、最初の呼び出しの後にのみ戻ります。


セットアップ メソッドは、シリアル接続とセンサー ピンを初期化し、さらに次の Wifi 初期化メソッドを呼び出してinitWifi()ネットワーク接続を確立します。

void initWifi(){
// check for the presence of the shield:
if (WiFi.status() == WL_NO_SHIELD) {
  Serial.println("WiFi shield not present");
  // don't continue:
  while(true);
}

  // attempt to connect to Wifi network:
  while(status != WL_CONNECTED){
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network  
    status = WiFi.begin(ssid, pass);

    // wait 10 seconds for connection:
    delay(10000);
  } 
  Serial.println("Connected to wifi");
}

一般的な方法は次のloop()ようになります。

...
File myFile = SD.open("sensor.txt", FILE_WRITE);      
if(myFile){    
  String timestamp = requestTimestamp();         <------ call from HERE [1]
  Serial.println("current date is: "+timestamp);

  myFile.println(String(cm)+"  "+timestamp);
  myFile.close();
  Serial.println(String(cm)+"  "+timestamp);
}
...

requestTimestamp()HTTP HEAD リクエストを作成し、 loop() メソッドに戻らない関数です (一度完全に機能した後!)。

String requestTimestamp(){
  Serial.println("\nRequest timestamp");

  WiFiClient client;
  if(client.connect(server, 80)){
    client.println("HEAD / HTTP/1.1");
    client.println("Host:www.google.com");
    client.println("HTTP-date: asctime-date");
    client.println("Connection: close");
    client.println();
  }  

  String time_str = "-1";
  boolean timestampKnown = false;
  while(client.connected() && !timestampKnown){
    String line = "";
    while(client.available()){    //  && !timestampKnown
      char c = client.read();

      if(c == '\n'){
        if(line.startsWith("Date:")){
          String DATE = line.substring(11, line.length()-4);
          time_str = formatTimestamp(DATE);
          Serial.println("-->"+time_str);
          timestampKnown = true;
        }

        Serial.println(line);
        line = "";
      }else{
        line += String(c);
        c = char();
      }
    }

    //if(timestampKnown)
      //break;
  }
  client.stop();

  Serial.println("--------------------------"+time_str);

  return time_str;   <--- from here it never returns to loop()
}

そのconsole outputように見えます:

SD card initialized.
Attempting to connect to SSID: ********
Connected to wifi

Request timestamp
HTTP/1.1 302 Found
Location: http://www.google.de/?gws_rd=cr&ei=Gm5IUvXHEbeg4AON9YCwCw
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Set-Cookie: PREF=ID=9684aab183999fb2:FF=0:TM=1380478490:LM=1380478490:S=EnaD0yx20-9BT6-4; expires=Tue, 29-Sep-2015 18:14:50 GMT; path=/; domain=.google.com
Set-Cookie: NID=67=R6OUfZAakXBBYSp_a9QRO56OzZxYS2X6RmpFlByzSOMgVXalyfYOuilvzQZjaNPRK9409kjjPsDIOEI4h44qIfljzYfS_57MrsQNaKp8S35iMUHKkgLwrkgGs7dRy6gQ; expires=Mon, 31-Mar-2014 18:14:50 GMT; path=/; domain=.google.com; HttpOnly
P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
-->20:14 29.9.2013
Date: Sun, 29 Sep 2013 18:14:50 GMT
Server: gws
Content-Length: 258
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Alternate-Protocol: 80:quic
Connection: close

--------------------------20:14 29.9.2013  <-- last line inside function before return
current date is: 20:14 29.9.2013  <-- printed from main loop() method
220  20:14 29.9.2013  <-- main loop() also




Request timestamp
HTTP/1.1 302 Found
Location: http://www.google.de/?gws_rd=cr&ei=Im5IUvO5GvSs4AOyhYHoAw
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Set-Cookie: PREF=ID=f1a3f58848455aa8:FF=0:TM=1380478498:LM=1380478498:S=cwG8W2Ll10fiiu_e; expires=Tue, 29-Sep-2015 18:14:58 GMT; path=/; domain=.google.com
Set-Cookie: NID=67=v_OGI8alGJj4TJEBZSjz9EYUJljTm58uBSxG_rdAcz6OIUNzoDLPGCBx_UlRw5jFkIKINivce2UhisHnEpsWJlFyQVLSG7n9Jkoopo-g2gNi0BgFbVXjXypcvA5SYBX9; expires=Mon, 31-Mar-2014 18:14:58 GMT; path=/; domain=.google.com; HttpOnly
P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
-->20:14 29.9.2013
Date: Sun, 29 Sep 2013 18:14:58 GMT
Server: gws
Content-Length: 258
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Alternate-Protocol: 80:quic
Connection: close 

<--- HERE: print out of the results like before is missing, and nothing futher happens......

サーバーは、私が読み取った応答の量を気にしますか? HTTP 1.0、Connection: close および client.stop() にもかかわらず、接続がまだ開いている可能性がありますか?

イメージングできる唯一の理由は、ネットワークに関連するものです。

4

1 に答える 1

0

別の理由として、RAM が不足している可能性があります。あなたはprogmemについて学びたいと思っています。さらに、String オブジェクトを操作しています。私はそれらを避けようとします。少なくとも、実際に残っている RAM の量を確認する必要があります。.

于 2013-09-30T13:45:23.097 に答える