[英]Arduino Ethernet Shield client.connect() always returns error
我一直在尋找這個問題幾天,但仍然沒有找到答案。
我正在嘗試根據 Arduino IDE 提供的示例代碼與 arduino 擴展板建立簡單的 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 和以太網擴展板
有什么建議?
我查看了以太網庫的源代碼,假設您有最新版本的庫。 在我看來,Arduino EthernetClient
connect()
函數需要一個IPAddress
對象或一個帶有遠程主機名稱的字符串( char *
)。 您正在向它傳遞一個字節數組,我的猜測是它可能將其解釋為字符串。 嘗試改為如下聲明server
全局變量:
IPAddress server(173 ,194, 46, 34);
如果它有效,則表明您可能從中獲取代碼的官方文檔已過時。
此外,您可以嘗試將所有其他參數作為IPAddress
對象提供給begin()
函數,以便不使用 DHCP,並且您可以排除自動配置問題。 原型是:
void begin(uint8_t *mac_address, IPAddress local_ip, IPAddress dns_server, IPAddress gateway, IPAddress subnet);
這么晚才回復很抱歉。
只需在調用client.connect()
之前添加 6 秒的延遲
所以初始化以太網屏蔽需要時間...... - 根據經驗
我設法提出了一種解決方法。 似乎 client.connect 僅在第一次調用時失敗。 所以我在 1 秒延遲后(在進行真正的呼叫之前)添加了一個虛擬呼叫。
這並沒有回答問題,但確實解決了問題。 歡迎任何關於為什么會發生這種情況的反饋。
delay(1000);
client.connect(server, 80); // Dummy call
好吧,我的解決方案是自己把所有的配置; google dns(8.8.8.8)、網關、子網、ip。 我認為主要的技巧是在 Ethernet.begin 之后有一個甜蜜的延遲。 我給出了 3000 的延遲,以便可以很好地建立連接並親自動手......
我的客戶端代碼遇到了類似的問題,直到我發現是我的防病毒防火牆阻止了 arduino 的客戶端連接。
我在我的防病毒軟件中添加了一個例外,現在它工作正常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.