Arduino Ethernet Shield client.connect()始终返回错误

时间:2014-01-27 17:31:37

标签: arduino ethernet

我一直在寻找这个问题几天但仍未找到答案。

我正在尝试根据Arduino IDE提供的示例代码与arduino shield建立简单的Webclient连接。这是我试图执行的简化版本:

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


byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte server[] = { 173 ,194, 46, 34 }; // Google

EthernetClient client;

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

  delay(1000);

  Serial.println(Ethernet.localIP());

  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(;;)
      ;
  }
}

总是得到答案:

192.168.0.103
connecting...
connection failed

disconnecting.

这意味着client.connect(server,80)失败。我尝试了几个IP地址和相同的结果。当我尝试使用WebServer示例时,屏蔽工作正常,并且似乎完美无缺。

硬件上的PS:我使用的是基于W5100的Arduino UNO R3和以太网屏蔽

有什么建议吗?

5 个答案:

答案 0 :(得分:1)

我看了以太网库的source code,假设您有最新版本的库。在我看来,Arduino EthernetClient connect()函数需要一个IPAddress对象或一个带有远程主机名称的字符串(char *)。你正在传递一个字节数组,我的猜测是它可能将它解释为一个字符串。 尝试按以下方式声明server全局变量:

IPAddress server(173 ,194, 46, 34);

如果有效,则表明您可能从中获取代码的official documentation已过时。

此外,您可以尝试将begin()函数作为IPAddress对象提供给所有其他参数,以便不使用DHCP,并且可以排除自动配置问题。原型是:

void begin(uint8_t *mac_address, IPAddress local_ip, IPAddress dns_server, IPAddress gateway, IPAddress subnet);

答案 1 :(得分:0)

我设法找到了解决方法。似乎client.connect仅在第一次调用时失败。所以我在1秒延迟之后(在进行真正的呼叫之前)添加了一个虚拟呼叫。

这不能回答这个问题,但确实解决了这个问题。任何关于为什么会发生这种情况的反馈都是值得欢迎的。

delay(1000);
client.connect(server, 80); // Dummy call

RGDS

答案 2 :(得分:0)

我知道这个答案为时已晚,但首先,我想知道你是如何解决这个问题的?...

嗯,我的解决方案是自己完成所有配置;谷歌DNS(8.8.8.8),网关,子网,IP。而且我认为主要的诀窍是在Ethernet.begin之后有一个甜蜜的延迟。我给了3000延迟,所以可以很好地建立连接并且手动......

我希望这有助于某人。

答案 3 :(得分:0)

抱歉迟到了。

在致电client.connect()

之前,只需加上6秒的延迟

因此初始化以太网屏蔽需要时间.... - 经验

答案 4 :(得分:-1)

我遇到了与我的客户端代码类似的问题,直到我发现它是我的防病毒软件防火墙阻止了arduino的客户端进行连接。

我在我的防病毒软件中添加了一个例外,现在它可以正常工作。