首页 文章

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

提问于
浏览
3

我一直在寻找这个问题几天但仍然没有找到答案 .

我试图根据Arduino IDE提供的示例代码与arduino shield Build 一个简单的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

    我看一下以太网库的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

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

    这不能回答这个问题,但确实解决了这个问题 . 有关为何发生这种情况的任何反馈都是受欢迎的 .

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

    RGDS

  • 0

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

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

    我希望这有助于某人 .

  • 0

    这么晚才回复很抱歉 .

    只需在拨打 client.connect() 之前加上6秒的延迟

    所以初始化以太网盾需要时间.... - 经验

  • -1

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

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

相关问题