2012-01-05 105 views
1

我使用自帶不改變的事情除了固件地址,我改了一個印在以太網盾牌背面與Arduino的軟件捆綁在一起的Web客戶端的例子以太網草圖。Arduino的DHCP不工作

每當我Arduino的連接到我的網絡,並查看序列監視器,我得到的唯一信息是,它「無法使用DHCP配置以太網」。

我已經安裝了帶有以太網屏蔽的Arduino Mega 2560,正確地將端口50連接到MISO,將51連接到MOSI,將52連接到SCK,並將10連接到SS(又名ETHCS,因爲它被印在以太網板上)。

你們有什麼想法,爲什麼這個DHCP錯誤會發生?

非常感謝您提供的任何幫助!

這裏是我的代碼:

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

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x73, 0xE4 }; //ethernet mac 
IPAddress server(192, 168, 1, 9); //valid server IP in my network 

EthernetClient client; 

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

    if (Ethernet.begin(mac) == 0) { 
    Serial.println("Failed to configure Ethernet using DHCP"); 

    for(;;) 
     ; 
    } 

    delay(1000); 
    Serial.println("connecting..."); 

    if (client.connect(server, 80)) { 
    Serial.println("connected"); 

    client.println("GET /search?q=arduino HTTP/1.0"); 
    client.println(); 
    } 
    else { 
    Serial.println("connection failed"); 
    } 
} 

void loop() 
{ 
    if (client.available()) { 
    char c = client.read(); 
    Serial.print(c); 
    } 


    if (!client.connected()) { 
    Serial.println(); 
    Serial.println("disconnecting."); 
    client.stop(); 

    for(;;) 
     ; 
    } 
} 
+0

事實證明(煩人),我做了一個錯誤的以太網屏蔽。新的以太網屏蔽解決了這個問題。 – Andrew 2012-03-02 05:57:29

+0

你是怎麼知道它有問題的?..我面臨着你面臨的同樣的問題,但我不能確定它是否有問題。 – Coderji 2014-04-13 07:45:03

回答

0

我昨天測試的代碼。 我的最後一個資源...擺脫「無限」循環,並返回到靜態IP,如果DHCP失敗。

1

試試這個代碼:)它爲我工作

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

// Enter a MAC address for your controller below. 
// Newer Ethernet shields have a MAC address printed on a sticker on the shield 
byte mac[] = { 
    0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 }; 

// Initialize the Ethernet client library 
// with the IP address and port of the server 
// that you want to connect to (port 80 is default for HTTP): 
EthernetClient client; 

void setup() { 
// Open serial communications and wait for port to open: 
    Serial.begin(9600); 
    // this check is only needed on the Leonardo: 


    // start the Ethernet connection: 
    if (Ethernet.begin(mac) == 0) { 
    Serial.println("Failed to configure Ethernet using DHCP"); 
    // no point in carrying on, so do nothing forevermore: 
    for(;;) 
     ; 
    } 
    // print your local IP address: 
    Serial.print("My IP address: "); 
    for (byte thisByte = 0; thisByte < 4; thisByte++) { 
    // print the value of each byte of the IP address: 
    Serial.print(Ethernet.localIP()[thisByte], DEC); 
    Serial.print("."); 
    } 
    Serial.println(); 
} 

void loop() { 

} 
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; 
} 
3

是固定的這對我的解決方案是從插槽中取出Micro SD卡,我看到了你的問題涉及到一個故障,但有這個問題關閉的Arduino後應該取出Micro SD卡等。

+0

非常感謝!刪除SD卡後,它第一次爲我工作! – powtac 2013-04-06 12:57:41

+0

是的,刪除SD卡也適用於我,但爲什麼? – ThomasW 2013-05-25 16:42:21

+0

這個問題看着這個問題:http://electronics.stackexchange.com/questions/67045/ethernet-begin-only-works-with-sd-card-removed-why – ThomasW 2013-05-27 14:57:57

0

我有同樣的問題。

我發現這個問題將其與一些類型的開關的產生,因爲我有兩個(安可模型ENH908-NWY版本3和其它IntelliNet的型號523301修訂版1)。

隨着開關喝采DHCP提出問題,Ethernet.begin(MAC)返回0,但IntelliNet的過程DHCP的工作沒有任何問題。

我有一個ADSL華爲在我家,其處理DHCP請求。

我認爲這個問題是一個以太網盾R3解決,但我還沒有試過。

我用它發佈代碼我嘗試DHCP請求。

當我嘗試以太網盾r3我來這裏告訴你。

問候!

屬性mac先前被定義爲具有六個十六進制的數組字節。

void networkSetting(){ 
    byte stateNet = 0; 

    //Se realiza petición DHCP para otros parámetros de Red si no están en memoria ya sea por System o Usuario 
    if ((EEPROM.read(userConfig) != setted) && (EEPROM.read(systemConf) != setted)) { 
     //Configurar el Socket solo con Mac 
     if (Ethernet.begin(mac) == 0){ 
      Serial.println("DHCP not initialized! Try again..."); 
      return; 
     } 

     //Verificamos conexión 
     stateNet = Ethernet.maintain(); 

     //Ponemos bandera de parámetros de Red System seteados si cumple alguna condición 
     if (stateNet == 0 || stateNet == 2 || stateNet == 4) 
     { 
      //Obtenemos parámetros de Red 
      getNetParams(); 
      //Guardamos parámetros de Red 
      saveNetParams(); 
      //Seteamos configuración por Sistema 
      EEPROM.write(systemConf, setted); 
     } else { 
      //Resetear Bandera de parámetros de System (Tomará DHCP en el próximo Reinicio) 
      EEPROM.write(systemConf, 0); 
     } 
    } else { 
     //cargar parámetros de red 
     loadNetParams(); 

     //Configurar el Socket con los parámetros desde la memoria 
     Ethernet.begin(mac, ip, gateway, gateway, subnet); 
    } 

    //Iniciar el Servidor 
    server.begin(); 

    //Se envían datos de estado de Red y Port a Puerto Serial 
    Serial.println("Running as " + String(stateNet) + " in port " + String(port) + "!"); 
} 

我附上了兩種情況的截圖。

The bad test with switch Encore

The good test with switch IntelliNet

+0

它是一個答案? – manetsus 2016-04-03 03:00:07