5

イーサネット シールドを備えた Arduino Uno を使用しています。

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

エラーは、イーサネット送信バッファのオーバーフローとは関係ありません (このアドバイスに従う)

失敗しているコードは次のとおりです。

#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;
}
4

2 に答える 2

1

v22のArduinoイーサネットライブラリにバグがあります(Linux / Windows V0022 / 1.0イーサネットの問題SOLVEDで説明されています)。

私にとっての解決策は、Ethernet2ライブラリ(tinker.itのPeterによる)を使用することでした。コードを少し調整する必要がありましたが、現在はすべて正常に機能しているようです。私は何とか問題なく送信された40000以上のHTTPメッセージを取得することができました。(単一のメッセージを送信できない場合もありますが、このエラー率は4%未満です。)

于 2011-09-21T12:37:12.457 に答える
0

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

于 2011-09-20T10:10:19.827 に答える