问题
ESP32通过SPI链接W5100和W5500以太网模块时,采用Ethernet库总是出现错误。在ESP32侧作为服务器时编译无法通过,作为客户端可以。从提示上看是其中的Server.h文件出现问题。
提示:
解决方法
打开Server.h文件,按下面修改:
class Server: public Print
{
public:
//virtual void begin(uint16_t port=0) =0; modified by CAI at 2021-12-13
virtual void begin() = 0;
};
这样修改就可以使用W5500模块了。
改写了这个头文件会不会造成其他的程序出现问题不清楚。其他使用到Server.h库的程序工作是不是正常也不清楚。但这样就可以编译通过了。
输出:
程序代码:
#include <SPI.h>
#include <Ethernet.h>
IPAddress ip(192,168,50,21);
EthernetServer server(80);
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
boolean alreadyConnected = false; // whether or not the client was connected previously
uint16_t xi = 0;
void setup()
{
Ethernet.init(SS);
Serial.begin(115200);
while (!Serial)
{
; // wait for serial port to connect. Needed for Leonardo only
}
delay(2000);
Serial.println("COM0 setup OK!");
pinMode(LED_BUILTIN, OUTPUT);
Serial.println("LED_BUILTIN = " + String(LED_BUILTIN));
Serial.println("SCK = " + String(SCK));
Serial.println("MISO = " + String(MISO));
Serial.println("MOSI = " + String(MOSI));
Serial.println("SS = " + String(SS));
Ethernet.begin(mac, ip);
// start the server
auto hwStatus = Ethernet.hardwareStatus();
switch (hwStatus)
{
case EthernetNoHardware:
Serial.println("No Ethernet hardware");
break;
case EthernetW5100:
Serial.println("Ethernet W5100 installed");
break;
case EthernetW5200:
Serial.println("Ethernet W5200 installed");
break;
case EthernetW5500:
Serial.println("Ethernet W5500 installed");
break;
}
auto link = Ethernet.linkStatus();
Serial.print("Link status: ");
switch (link)
{
case Unknown:
Serial.println("Unknown");
break;
case LinkON:
Serial.println("ON");
break;
case LinkOFF:
Serial.println("OFF");
break;
}
server.begin();
Serial.print("server start at IP address: ");
Serial.println(Ethernet.localIP());
}
void loop()
{
// wait for a new client:
EthernetClient client = server.available();
xi++;
if (xi > 40000)
{
xi = 0;
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}
// when the client sends the first byte, say hello:
if (client)
{
if (!alreadyConnected)
{
// clear out the input buffer:
client.flush();
Serial.println("We have a new client");
client.println("Hello, client!");
alreadyConnected = true;
}
if (client.available() > 0)
{
// read the bytes incoming from the client:
char thisChar = client.read();
// echo the bytes back to the client:
server.write(thisChar);
// echo the bytes to the server as well:
Serial.write(thisChar);
}
}
}
可以接收到到串口助手发来的文字信息。
后续
在使用W5500的情况下可以用Ethernet库。把Server.h的库修改就可以使用,但在使用无线网的时候就出现问题,不能编译通过,需要将上述的server.h的声明改回原来的原始版本,才能使用Wifi.h等库。在这里望大家周知。