2012-01-05 108 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