如何修复 LAN 上的多个 Arduino 导致超时
How do I fix multiple Arduinos on LAN causing timeouts
这是我的情况:我有一个交换机和两个连接了以太网屏蔽的 Arduino,两者都是 运行 一个简单的(测试)网络服务器程序。我的电脑也连接到交换机,所以我可以向 Arduinos 发送请求。这是Arduino程序(只有第二个Arduino上的IP地址不同):
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //ethernet shield mac address
byte ip[] = { 192, 168, 0, 11 }; // arduino IP in lan
byte gateway[] = { 192, 168, 0, 1 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
EthernetServer server(80); //server port
void setup() {
//start Ethernet
Ethernet.begin(mac, ip, gateway, gateway, subnet);
server.begin();
}
void loop() {
EthernetClient client = server.available();
if (client) {
int nrOfCharacters = 0;
String msg = "";
while (client.connected() && client.available()) {
char c = client.read();
Serial.print(c);
nrOfCharacters++;
if(c == '\n' || nrOfCharacters >= 6 && c == ' ')
{
httpResponse(client, msg);
}
else if(nrOfCharacters >= 6) {
msg += c;
}
}
}
}
void httpResponse(EthernetClient client, String msg)
{
client.println("HTTP/1.1 200 OK");
client.println();
client.print(msg);
client.stop();
}
一个Arduino的IP地址为192.168.0.10,另一个的IP地址为192.168.0.11。
一切正常,请求处理得很好,但是当我向一个 Arduino 发送请求,然后向另一个 Arduino 发送请求时,第二个 Arduino 超时,然后它再次工作。我几乎可以一遍又一遍地完美重现这个问题。
我已经尝试使用我在网上找到的这种方法检查 Arduinos 上的套接字状态:
byte socketStat[MAX_SOCK_NUM];
void ShowSockStatus()
{
for(int i = 0; i < MAX_SOCK_NUM; i++) {
Serial.print(F("Socket#"));
Serial.print(i);
uint8_t s = W5100.readSnSR(i);
socketStat[i] = s;
Serial.print(F(":0x"));
Serial.print(s, 16);
Serial.print(F(" "));
Serial.print(W5100.readSnPORT(i));
Serial.print(F(" D:"));
uint8_t dip[4];
W5100.readSnDIPR(i, dip);
for(int j = 0; j < 4; j++) {
Serial.print(dip[j], 10);
if(j < 3) Serial.print(".");
}
Serial.print(F("("));
Serial.print(W5100.readSnDPORT(i));
Serial.println(F(")"));
}
Serial.println("");
}
但我没有发现任何问题。我也检查了调用loop()
方法是否有'hickups',但也没有问题。
我怀疑这与发送到一个 Arduino 的数据在另一个 Arduino 上也被接收有关,导致了某种问题,但我并不真正熟悉网络交换机的工作原理。
有人有办法解决这个问题吗?
只有第二个 Arduino 上的 IP 地址不同,你也应该有一个不同的 MAC 地址。
这是我的情况:我有一个交换机和两个连接了以太网屏蔽的 Arduino,两者都是 运行 一个简单的(测试)网络服务器程序。我的电脑也连接到交换机,所以我可以向 Arduinos 发送请求。这是Arduino程序(只有第二个Arduino上的IP地址不同):
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //ethernet shield mac address
byte ip[] = { 192, 168, 0, 11 }; // arduino IP in lan
byte gateway[] = { 192, 168, 0, 1 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
EthernetServer server(80); //server port
void setup() {
//start Ethernet
Ethernet.begin(mac, ip, gateway, gateway, subnet);
server.begin();
}
void loop() {
EthernetClient client = server.available();
if (client) {
int nrOfCharacters = 0;
String msg = "";
while (client.connected() && client.available()) {
char c = client.read();
Serial.print(c);
nrOfCharacters++;
if(c == '\n' || nrOfCharacters >= 6 && c == ' ')
{
httpResponse(client, msg);
}
else if(nrOfCharacters >= 6) {
msg += c;
}
}
}
}
void httpResponse(EthernetClient client, String msg)
{
client.println("HTTP/1.1 200 OK");
client.println();
client.print(msg);
client.stop();
}
一个Arduino的IP地址为192.168.0.10,另一个的IP地址为192.168.0.11。
一切正常,请求处理得很好,但是当我向一个 Arduino 发送请求,然后向另一个 Arduino 发送请求时,第二个 Arduino 超时,然后它再次工作。我几乎可以一遍又一遍地完美重现这个问题。
我已经尝试使用我在网上找到的这种方法检查 Arduinos 上的套接字状态:
byte socketStat[MAX_SOCK_NUM];
void ShowSockStatus()
{
for(int i = 0; i < MAX_SOCK_NUM; i++) {
Serial.print(F("Socket#"));
Serial.print(i);
uint8_t s = W5100.readSnSR(i);
socketStat[i] = s;
Serial.print(F(":0x"));
Serial.print(s, 16);
Serial.print(F(" "));
Serial.print(W5100.readSnPORT(i));
Serial.print(F(" D:"));
uint8_t dip[4];
W5100.readSnDIPR(i, dip);
for(int j = 0; j < 4; j++) {
Serial.print(dip[j], 10);
if(j < 3) Serial.print(".");
}
Serial.print(F("("));
Serial.print(W5100.readSnDPORT(i));
Serial.println(F(")"));
}
Serial.println("");
}
但我没有发现任何问题。我也检查了调用loop()
方法是否有'hickups',但也没有问题。
我怀疑这与发送到一个 Arduino 的数据在另一个 Arduino 上也被接收有关,导致了某种问题,但我并不真正熟悉网络交换机的工作原理。
有人有办法解决这个问题吗?
只有第二个 Arduino 上的 IP 地址不同,你也应该有一个不同的 MAC 地址。