首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arduino Ethernet Shield client.connect()总是返回错误

Arduino Ethernet Shield client.connect()总是返回错误
EN

Stack Overflow用户
提问于 2014-01-28 01:31:37
回答 5查看 8.2K关注 0票数 3

这个问题我已经找了几天了,但还是没有找到答案。

我正在尝试基于arduino IDE提供的示例代码与Arduino shield建立一个简单的Webclient连接。下面是我正在尝试执行的代码的简化版本:

代码语言:javascript
复制
#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(;;)
      ;
  }
}

并且总是得到答案:

代码语言:javascript
复制
192.168.0.103
connecting...
connection failed

disconnecting.

这意味着client.connect(服务器,80)出现故障。我已经尝试了几个IP地址,结果是一样的。屏蔽工作正常,就像我尝试过的WebServer示例一样,似乎工作得无懈可击。

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

有什么建议吗?

EN

回答 5

Stack Overflow用户

发布于 2015-08-05 04:35:28

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

代码语言:javascript
复制
IPAddress server(173 ,194, 46, 34);

如果它工作正常,则表明您可能从中获取代码的official documentation已过时。

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

代码语言:javascript
复制
void begin(uint8_t *mac_address, IPAddress local_ip, IPAddress dns_server, IPAddress gateway, IPAddress subnet);
票数 1
EN

Stack Overflow用户

发布于 2017-03-09 15:07:59

抱歉,回复晚了。

只需在调用client.connect()之前添加6秒的延迟

所以初始化以太网屏需要时间....-by体验

票数 1
EN

Stack Overflow用户

发布于 2014-01-28 06:36:02

我设法找到了一种变通方法。似乎只有在第一次调用client.connect时才会失败。因此,我在1秒延迟后添加了一个虚拟呼叫(在进行真正的呼叫之前)。

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

代码语言:javascript
复制
delay(1000);
client.connect(server, 80); // Dummy call
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21387597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档