2011-09-15 22 views
5

私はイーサネットシールド付きArduino Unoを使用しています。多くのクライアントの印刷後にArduino(Uno)イーサネットクライアント接続が失敗する

多くのHTTP要求(、client.println(...)、)を送信した後、接続時にクライアントが失敗し始めます。故障までの時間はランダムであるように見え、ループからのシーケンス読み取り値は〜1000〜7000の間で変化することがあります。

エラーがここ

が失敗しているコードである(this advice後)オーバーフローイーサネット送信バッファに関係しない。

#include <Ethernet.h> 
#include <SPI.h> 

// Network constants 
byte mac[] = {0x00, 0x23, 0xdf, 0x82, 0xd4, 0x01}; 
byte ip[] = {/*REDACTED*/}; 
byte server[] = {/*REDACTED*/}; 
int port = /*REDACTED*/; 
Client client(server, port); 

// State 
int sequence; 

void setup(){ 
    Ethernet.begin(mac, ip); 
    Serial.begin(9600); 
    sequence = 0; 

    delay(1000); 
} 

void loop(){ 
    httpPut("/topic/:test/publish?sessionId=SESenanhygrp"); 
    Serial.println(sequence++); 
} 

void httpPut(char* url){ 
    if (!client.connect()) { 
     Serial.println("EXCEPTION: during HTTP PUT. Could not connect"); 
     return; 
    } 

    client.print("PUT"); 
    client.print(" "); 
    client.print(url); 
    client.println(" HTTP/1.0"); 
    client.println(); 

    while(!client.available()){ 
     delay(1); 
    } 

    while(client.available()) { 
     char c = client.read(); 
     Serial.print(c); 
    } 

    while(client.connected()){ 
     Serial.println("Waiting for server to disconnect"); 
    } 

    client.stop(); 
} 

エラーは、次のセグメントで発生

if (!client.connect()) { 
    Serial.println("EXCEPTION: during HTTP PUT. Could not connect"); 
    return; 
} 
+0

クライアントが接続に失敗した時点で、私は2つのことを行います:(1)サーバーログで何らかのエビデンスがないかチェックしてください障害の発生した接続要求を受信したサーバの名前。 (2)サーバー上で 'netstat'を使用して、以前の接続が閉じられているか、残っているかを確認します。 – NPE

+0

上記に加えて、3)スタックがオーバーフローしているかどうかを確認します。 4)何千回ものサイクル後にメモリリークが発生していますか? – Jeff

+0

サーバーログに問題はありませんでした。 Arduinosを使用しているときは常にメモリが問題になりますが、上記のコードはかなりメモリ保護されている必要があります – ChrisSSocha

答えて

0

v22のArduinoイーサネットライブラリに不具合があります(Linux/Windows V0022/1.0 Ethernet problem SOLVED)。

私にとっての解決策は、Ethernet2ライブラリ(tinker.itのPeter氏)を使用することでした。コードは軽微な修正が必要でしたが、すべてが正常に動作しているようです。私は何の問題もなく40000以上のHTTPメッセージを送ってきました。

0

私は、メッセージ間の時間を10倍にすることによって通信速度を遅くします。もしあなたが1000と7000のメッセージの間にエラーを出さなければ、それはおそらくあなたがあなたの小さなArduinoにはあまりにも速く話していることを意味し、バッファは通信ライブラリが残念ながら回復できないオーバーフローを引き起こします。私はまた、各メッセージの後にシリアルポート経由でArduinoフリーバイトをバッファに入れて監視します。 PCからできるだけ早くメッセージを送信することでこの動作をテストし、しばらくしてからArduinoがフリーズするかどうかを確認することもできます。そうであれば、バッファがある限界を超えるまでメッセージを拒否することを検討するかもしれません。

関連する問題