2017-05-23 16 views
0

これは私の状況です:イーサネットシールド付きのスイッチと2台のArduinosが接続されており、どちらもシンプルなWebサーバープログラムを実行しています。私のコンピュータもスイッチに接続されているので、Arduinosにリクエストを送ることができます。LAN上で複数のArduinosをタイムアウトさせる方法を教えてください

#include <Ethernet.h> 

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //ethernet shield mac address 
byte ip[] = { 192, 168, 0, 11 }; // arduino IP in lan 
byte gateway[] = { 192, 168, 0, 1 }; // internet access via router 
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask 
EthernetServer server(80); //server port 

void setup() { 
    //start Ethernet 
    Ethernet.begin(mac, ip, gateway, gateway, subnet); 
    server.begin(); 
} 

void loop() { 
    EthernetClient client = server.available(); 
    if (client) { 
    int nrOfCharacters = 0; 
    String msg = ""; 
    while (client.connected() && client.available()) { 
     char c = client.read(); 
     Serial.print(c); 
     nrOfCharacters++; 

     if(c == '\n' || nrOfCharacters >= 6 && c == ' ') 
     { 
     httpResponse(client, msg); 
     } 
     else if(nrOfCharacters >= 6) { 
     msg += c; 
     }  
    } 
    } 
} 

void httpResponse(EthernetClient client, String msg) 
{ 
    client.println("HTTP/1.1 200 OK"); 
    client.println(); 
    client.print(msg); 
    client.stop(); 
} 

一つのArduinoは、IPアドレス192.168.0.10を持ち、他方はIPアドレス192.168.0.11があります。これは、Arduinoのプログラム(第2 Arduinoの上のIPアドレスのみ異なっている)です。

すべてがうまく動作し、リクエストは完全に処理されますが、1つのArduinoにリクエストを送信した後、2つ目のArduinoがタイムアウトした後、再び動作します。私はこの問題をほぼ完全に再現することができます。私はオンラインで見つけるこの方法を使用してArduinos上のソケットの状態を検査しようとしている

は:

byte socketStat[MAX_SOCK_NUM]; 

void ShowSockStatus() 
{ 
    for(int i = 0; i < MAX_SOCK_NUM; i++) { 
     Serial.print(F("Socket#")); 
     Serial.print(i); 
     uint8_t s = W5100.readSnSR(i); 
     socketStat[i] = s; 
     Serial.print(F(":0x")); 
     Serial.print(s, 16); 
     Serial.print(F(" ")); 
     Serial.print(W5100.readSnPORT(i)); 
     Serial.print(F(" D:")); 
     uint8_t dip[4]; 
     W5100.readSnDIPR(i, dip); 
     for(int j = 0; j < 4; j++) { 
     Serial.print(dip[j], 10); 
     if(j < 3) Serial.print("."); 
     } 
     Serial.print(F("(")); 
     Serial.print(W5100.readSnDPORT(i)); 
     Serial.println(F(")")); 
    } 
    Serial.println(""); 
} 

しかし、私は何の問題が見つかりませんでした。 loop()メソッドを呼び出す際にヒックアップがあるかどうかを調べましたが、問題はありませんでした。

私はArduinoに送信されたデータと何らかの関係があると考えています。これは何らかの問題を引き起こしますが、ネットワークスイッチの動作にはあまり慣れていません。

これを解決する方法はありますか?

+1

@ JarrodRoberson良いキャッチ、これはおそらく起こります - スイッチは、このMacがどこに接続し、別の場所にデータを配信しないかを認識します。 – Slava

+0

参考:[arduino.se] –

+0

@JarrodRobersonあなたは私の一日をしました。ありがとうございました。 MACアドレスとBAMを変更しました。これ以上の問題はありません。 – yaba

答えて

2

2番目のArduinoのIPアドレスのみが異なるの場合は、別のMACアドレスも必要です。