2

我将示例以太网草图用于与 Arduino 软件捆绑在一起的 Web 客户端,除了固件地址外,我没有更改任何东西,我将其更改为印在以太网屏蔽背面的那个。

每当我将 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(;;)
      ;
  }
}
4

6 回答 6

3

为我解决此问题的解决方案是从插槽中移除 Micro SD 卡,我看到您的问题与故障有关,但其他有此问题的人应在关闭 Arduino 后移除 Micro SD 卡。

于 2013-02-10T21:47:44.343 回答
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() {

}
于 2012-07-25T19:48:08.693 回答
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;
}
于 2013-01-22T19:30:19.850 回答
0

我昨天测试了那个代码。我的最后一个资源...摆脱“无限”循环并在 DHCP 失败时返回静态 IP。

于 2012-02-28T19:20:57.597 回答
0

我也有同样的问题。

我发现某些类型的交换机会产生问题,因为我有两个(Encore Model ENH908-NWY Ver 3 和其他 IntelliNet Model 523301 Rev1)。

使用交换机 Encore,DHCP 出现问题,Ethernet.begin(mac) 返回 0,但使用 IntelliNet,DHCP 进程正常工作。

我家里有一台华为 ADSL 来处理 DHCP 请求。

我认为它用以太网屏蔽 r3 解决了这个问题,但我还没有尝试过。

我用它发布代码我尝试 DHCP 请求。

当我尝试 ethernet shield 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) + "!");
}

我附上了这两个案例的截图。

开关 Encore 的糟糕测试

使用交换机 IntelliNet 进行的良好测试

于 2016-04-03T02:35:13.037 回答
0

使用 DHCP 配置以太网失败。Ethernet.begin(mac) 总是返回 0。

许多人报告完全相同的问题。看来你必须连接到路由器,而不是交换机。</p>

如果不是,您必须将您的 PC 作为服务器,请点击此链接了解更多信息--> https://www.youtube.com/watch?v=4xwwV_s9Gik

于 2019-01-29T13:46:19.937 回答