저는 Arduino Mega를 기반으로 WizNET 이더넷 shield 및 포함 된 SD 카드 리더기를 사용하는 보드를 설계했습니다. 표준 이더넷 라이브러리 및 SdFat를 사용하면 문제가 없습니다.ENC28J60 (EtherCard)와 SD 카드 (SdFat)를 Arduino Mega에서 동시에 사용합니다.
이제 하드웨어 디자인을 ElecFreaks의 ENC28J60 Ethernet board 및 ElecFreaks SD card breakout board을 사용하도록 변경했습니다. 전기 캐비닛의 DIN 레일에 장착 할 수있는 케이스를 설계 할 수있는 능력이 향상되었습니다. 나는 SdFat에 머물렀다.하지만 EtherCard 라이브러리를 사용하여 ENC28J60과 통신해야했다.
나는 칩 선택 라인을 위해 메가의 핀 13과 핀 14를 사용하고 두 개의 보드를 SPI 버스에 연결했다. 두 보드 모두 라이브러리의 예제 파일을 사용하여 완벽하게 작동합니다. 필자는 SD 카드의 파일에서 구성을 읽고 파일의 값으로 이더넷을 설정합니다. 여태까지는 그런대로 잘됐다. SD 카드가 올바르게 액세스되고 이더넷 보드가 핑 요청에 응답합니다. 이제 문제는 이더넷 보드에서 TCP 요청을 할 수 없다는 것입니다.
어떻게이 두 보드를 함께 사용할 수 있습니까?
트릭을 수행해야하는 코드는 다음과 같습니다.하지만 그렇지 않습니다.
//Initial request
char request_uri[] = "/foo/bar/";
Stash::prepare(PSTR("GET $F HTTP/1.1" "\r\n"
"User-Agent: arduino/1.5.2" "\r\n"
"\r\n"),
request_uri);
ether.copyIp(ether.hisip, target_ip);
ether_sessionID = ether.tcpSend();
request_timer = millis() + REQUEST_TIMEOUT;
//And in the loop
ether.packetLoop(ether.packetReceive());
//Function called after initial request in loop (different state)
void checkTcpResponse() {
const char* reply = ether.tcpReply(ether_sessionID);
if (reply != 0) {
Serial.println(reply);
}
else {
if (millis() > request_timer) {
Serial.println("Timeout reached");
state = STATE_RESET;
delay(1000);
}
}
}
//This is just cut from the code, so it is not complete, etc.
요청하는 동안 연결된 웹 서버의 access.log를보고 있습니다. 아무 일도 일어나지 않습니다 : (이전에 말했듯이, EtherCard 라이브러리의 WebClient 예제를 통해 주어진 웹 서버에 대한 요청이 작동하고 로그에 나타납니다.)
BTW, 이것은 Ethercard 라이브러리의 NoIPClient 예제를 기반으로합니다 ... – pmayer