我一直在寻找这个问题几天但仍然没有找到答案 .
我试图根据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 回答
我看一下以太网库的source code,假设您有最新版本的库 . 在我看来,Arduino
EthernetClient
connect()
函数想要一个IPAddress
对象或一个字符串(char *
)与远程主机的名称 . 你正在传递一个字节数组,我的猜测是它可能将它解释为一个字符串 . 尝试按如下方式声明server
全局变量:如果它有效,则表明您可能从中获取代码的official documentation已过时 .
此外,您可以尝试将
begin()
函数作为IPAddress
对象提供给所有其他参数,这样就不会使用DHCP,您可以排除自动配置问题 . 原型是:我设法找到了解决方法 . 似乎client.connect仅在第一次调用时失败 . 所以我在1秒延迟之后(在进行真正的呼叫之前)添加了一个虚拟呼叫 .
这不能回答这个问题,但确实解决了这个问题 . 有关为何发生这种情况的任何反馈都是受欢迎的 .
RGDS
本
我知道这个答案为时已晚,但首先,我想知道你是如何解决这个问题的?
好吧,我的解决方案是自己完成所有配置;谷歌DNS(8.8.8.8),网关,子网,IP . 而且我认为主要的诀窍是在Ethernet.begin之后有一个甜蜜的延迟 . 我给了3000延迟,所以连接可以很好地 Build 和手...
我希望这有助于某人 .
这么晚才回复很抱歉 .
只需在拨打
client.connect()
之前加上6秒的延迟所以初始化以太网盾需要时间.... - 经验
我遇到了与我的客户端代码类似的问题,直到我发现它是我的防病毒软件防火墙阻止arduino的客户端连接 .
我在我的防病毒软件中添加了一个例外,现在它工作正常 .