2013-01-18 116 views
-1

我與一個Arduino烏諾測試以太網shield,而我得到一個錯誤DHCP只是用例子草圖。Arduino的DHCP錯誤

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

byte MACaddress[] = { 0x90, 0xAD, 0xDA, 0x0D, 0x96, 0xFE }; 

EthernetClient client; 

void setup() { 
    Serial.begin(9600); 
    while (!Serial) { 
     ; 
    } 

    // Start the Ethernet connection: 
    if (Ethernet.begin(MACaddress) == 0) { 
     Serial.println("Failed to configure Ethernet using DHCP"); 
     for(;;) 
      ; 
    } 
    Serial.print("My IP address: "); 
    for (byte thisByte = 0; thisByte < 4; thisByte++) { 
     Serial.print(Ethernet.localIP()[thisByte], DEC); 
     Serial.print("."); 
    } 
    Serial.println(); 
} 

void loop() { 
} 

我已經打開路由器的管理頁面,我可以看到它給了Arduino的一個IP address,與MAC address相關。我也嘗試了代碼中的靜態IP地址(Ethernet.begin(MACaddress, IPaddress)),但它也不起作用。

我無法ping顯示路由器管理員頁面屏蔽IP地址。

什麼是錯的只是這個簡單的代碼?

一切是開箱即用,Arduino的和屏蔽的。我沒有對他們做任何事情,只是將屏蔽連接到Arduino併發送了代碼。看起來一切正常,LEDs閃爍兩個主板。

+0

有許多以太網盾牌,編輯問題,包括模型。示例代碼僅適用於一種類型,可能不兼容。如果他們不知道硬件是什麼,人們就無法在這方面提供幫助。 – jdr5ca

回答

0

這些循環是沒有用的..你可以嘗試像:

#if defined(ARDUINO) && ARDUINO > 18 
#include <SPI.h> 
#endif 
#include <Ethernet.h> 
#include <EthernetDHCP.h> 

// MAC Address 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; 

const char* ip_to_str(const uint8_t*); 

// Initialize the Ethernet server library 
Server server(8080); 

void setup() 
{ 
    Serial.begin(9600); 

    Serial.println("Attempting to obtain a DHCP lease..."); 

    // Initiate a DHCP session. The argument is the MAC (hardware) address that 
    // you want your Ethernet shield to use. This call will block until a DHCP 
    // lease has been obtained. The request will be periodically resent until 
    // a lease is granted, but if there is no DHCP server on the network or if 
    // the server fails to respond, this call will block forever. 
    // Thus, you can alternatively use polling mode to check whether a DHCP 
    // lease has been obtained, so that you can react if the server does not 
    // respond (see the PollingDHCP example). 
    EthernetDHCP.begin(mac); 

    // Since we're here, it means that we now have a DHCP lease, so we print 
    // out some information. 
    const byte* ipAddr = EthernetDHCP.ipAddress(); 
    const byte* gatewayAddr = EthernetDHCP.gatewayIpAddress(); 
    const byte* dnsAddr = EthernetDHCP.dnsIpAddress(); 

    Serial.println("A DHCP lease has been obtained."); 

    Serial.print("My IP address is "); 
    Serial.println(ip_to_str(ipAddr)); 

    Serial.print("Gateway IP address is "); 
    Serial.println(ip_to_str(gatewayAddr)); 

    Serial.print("DNS IP address is "); 
    Serial.println(ip_to_str(dnsAddr)); 

    // Start the server 
    server.begin(); 
} 

void loop() 
{ 
    // You should periodically call this method in your loop(): It will allow 
    // the DHCP library to maintain your DHCP lease, which means that it will 
    // periodically renew the lease and rebind if the lease cannot be renewed. 
    // Thus, unless you call this somewhere in your loop, your DHCP lease might 
    // expire, which you probably do not want :-) 
    EthernetDHCP.maintain(); 

    // listen for incoming clients 
    Client client = server.available(); 
    if (client) { 
    // an http request ends with a blank line 
    boolean currentLineIsBlank = true; 
    while (client.connected()) { 
     if (client.available()) { 
     char c = client.read(); 
     // if you've gotten to the end of the line (received a newline 
     // character) and the line is blank, the http request has ended, 
     // so you can send a reply 
     if (c == '\n' && currentLineIsBlank) { 
      // send a standard http response header 
      client.println("HTTP/1.1 200 OK"); 
      client.println("Content-Type: text/html"); 
      client.println(); 

      // Some misc. HTML 
      client.println("<title>Arduino Control Panel</title>"); 
      client.println("<center><h1>Control Panel</h1></center>"); 
      client.println("<p></p>"); 

      // output the value of each analog input pin 
      for (int analogChannel = 0; analogChannel < 6; analogChannel++) { 
      client.print("Analog input "); 
      client.print(analogChannel); 
      client.print(" is "); 
      client.print(analogRead(analogChannel)); 
      client.println("<br />"); 
      } 
      break; 
     } 
     if (c == '\n') { 
      // you're starting a new line 
      currentLineIsBlank = true; 
     } 
     else if (c != '\r') { 
      // you've gotten a character on the current line 
      currentLineIsBlank = false; 
     } 
     } 
    } 
    // give the web browser time to receive the data 
    delay(1); 
    // close the connection: 
    client.stop(); 
    } 
} 

// Just a utility function to nicely format an IP address. 
const char* ip_to_str(const uint8_t* ipAddr) 
{ 
    static char buf[16]; 
    sprintf(buf, "%d.%d.%d.%d\0", ipAddr[0], ipAddr[1], ipAddr[2], ipAddr[3]); 
    return buf; 
} 
0

我不知道你所說的「我也試着在代碼的靜態IP地址」的意思。如果你簡單地更換 如果(Ethernet.begin(MACADDRESS)== 0){

與 如果(Ethernet.begin(MACADDRESS,MYIP)== 0){

結果可能是不可預測的,因爲沒有返回值。在失敗時成功DHCP連接,0 1:

EthernetBegin

返回 該函數的DHCP版本,Ethernet.begin(MAC),返回int。其他版本不返回任何內容。

你嘗試過用固定IP的一個例子?