我一直在寻找这个问题几天但仍未找到答案。
我正在尝试根据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和以太网屏蔽
有什么建议吗?
答案 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()
因此初始化以太网屏蔽需要时间.... - 经验
答案 4 :(得分:-1)
我遇到了与我的客户端代码类似的问题,直到我发现它是我的防病毒软件防火墙阻止了arduino的客户端进行连接。
我在我的防病毒软件中添加了一个例外,现在它可以正常工作。