2013-11-04 50 views
0

我的Arduino代碼出現了一些問題,我製作了一個Arduino以太網SD網絡服務器,它的任務是獲取指令並點亮電源開關,並顯示開關是打開還是關閉。一切正常。但問題是,我可以連接到arduino web服務器幾次然後發生了一些事情,我無法連接到它,然後我必須重新啓動它才能夠再次連接到它。任何人都可以幫我嗎?Arduino以太網服務器問題

#include <SPI.h> 
#include <Ethernet.h> 
#include <SD.h> 
#include <RemoteTransmitter.h> 
// size of buffer used to capture HTTP requests 
#define REQ_BUF_SZ 60 

// MAC address from Ethernet shield sticker under board 
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0E, 0x95, 0x2F }; 
IPAddress ip(192, 168, 1, 200); // IP address, may need to change depending on network 
EthernetServer server(80); // create a server at port 80 
File webFile;    // the web page file on the SD card 
char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string 
char req_index = 0;    // index into HTTP_req buffer 
boolean LED_state[3] = {0}; // stores the states of the LEDs 
ActionTransmitter actionTransmitter(9); 

void setup() 
{ 
    // Everything resets to Off if arduino is reseted 
    actionTransmitter.sendSignal(1,'A',false); 
    actionTransmitter.sendSignal(1,'B',false); 
    actionTransmitter.sendSignal(1,'C',false); 

    // disable Ethernet chip 
    pinMode(10, OUTPUT); 
    digitalWrite(10, HIGH); 

    Serial.begin(9600);  // for debugging 

    // initialize SD card 
    Serial.println("Initializing SD card..."); 
    if (!SD.begin(4)) { 
     Serial.println("ERROR - SD card initialization failed!"); 
     return; // init failed 
    } 
    Serial.println("SUCCESS - SD card initialized."); 
    // check for index.htm file 
    if (!SD.exists("index.htm")) { 
     Serial.println("ERROR - Can't find index.htm file!"); 
     return; // can't find index file 
    } 
    Serial.println("SUCCESS - Found index.htm file."); 


    Ethernet.begin(mac, ip); // initialize Ethernet device 
    server.begin();   // start to listen for clients 
} 

void loop() 
{ 
    EthernetClient client = server.available(); // try to get client 

    if (client) { // got client? 
     boolean currentLineIsBlank = true; 
     while (client.connected()) { 
      if (client.available()) { // client data available to read 
       char c = client.read(); // read 1 byte (character) from client 
       // limit the size of the stored received HTTP request 
       // buffer first part of HTTP request in HTTP_req array (string) 
       // leave last element in array as 0 to null terminate string (REQ_BUF_SZ - 1) 
       if (req_index < (REQ_BUF_SZ - 1)) { 
        HTTP_req[req_index] = c;   // save HTTP request character 
        req_index++; 
       } 
       // last line of client request is blank and ends with \n 
       // respond to client only after last line received 
       if (c == '\n' && currentLineIsBlank) { 
        // send a standard http response header 
        client.println("HTTP/1.1 200 OK"); 
        // remainder of header follows below, depending on if 
        // web page or XML page is requested 
        // Ajax request - send XML file 
        if (StrContains(HTTP_req, "ajax_inputs")) { 
         // send rest of HTTP header 
         client.println("Content-Type: text/xml"); 
         client.println("Connection: keep-alive"); 
         client.println(); 
         SetLEDs(); 
         // send XML file containing input states 
         XML_response(client); 
        } 
        else { // web page request 
         // send rest of HTTP header 
         client.println("Content-Type: text/html"); 
         client.println("Connection: keep-alive"); 
         client.println(); 
         // send web page 
         webFile = SD.open("index.htm");  // open web page file 
         if (webFile) { 
          while(webFile.available()) { 
           client.write(webFile.read()); // send web page to client 
          } 
          webFile.close(); 
         } 
        } 
        // display received HTTP request on serial port 
        Serial.print(HTTP_req); 
        // reset buffer index and all buffer elements to 0 
        req_index = 0; 
        StrClear(HTTP_req, REQ_BUF_SZ); 
        break; 
       } 
       // every line of text received from the client ends with \r\n 
       if (c == '\n') { 
        // last character on line of received text 
        // starting new line with next character read 
        currentLineIsBlank = true; 
       } 
       else if (c != '\r') { 
        // a text character was received from client 
        currentLineIsBlank = false; 
       } 
      } // end if (client.available()) 
     } // end while (client.connected()) 
     delay(1);  // give the web browser time to receive the data 
     client.stop(); // close the connection 
    } // end if (client) 
} 

// checks if received HTTP request is switching on/off LEDs 
// also saves the state of the LEDs 
void SetLEDs(void) 
{ 

    // LED 3 (pin 8) 
    if (StrContains(HTTP_req, "LED1=1")) { 
     LED_state[0] = 1; // save LED state 
     actionTransmitter.sendSignal(1,'A',true); 
     Serial.print("button 1 on "); 
    } 
    else if (StrContains(HTTP_req, "LED1=0")) { 
     LED_state[0] = 0; // save LED state 
     actionTransmitter.sendSignal(1,'A',false); 
     Serial.print("button 1 off"); 
    } 
    // LED 4 (pin 9) 
    if (StrContains(HTTP_req, "LED2=1")) { 
     LED_state[1] = 1; // save LED state 
     actionTransmitter.sendSignal(1,'B',true); 
    } 
    else if (StrContains(HTTP_req, "LED2=0")) { 
     LED_state[1] = 0; // save LED state 
     actionTransmitter.sendSignal(1,'B',false); 
    } 
    if (StrContains(HTTP_req, "LED3=1")) { 
     LED_state[2] = 1; // save LED state 
     actionTransmitter.sendSignal(1,'C',true); 
    } 
    else if (StrContains(HTTP_req, "LED3=0")) { 
     LED_state[2] = 0; // save LED state 
     actionTransmitter.sendSignal(1,'C',false); 
    } 
} 

// send the XML file with analog values, switch status 
// and LED status 
void XML_response(EthernetClient cl) 
{ 
    int analog_val;   // stores value read from analog inputs 
    int count;     // used by 'for' loops 


    cl.print("<?xml version = \"1.0\" ?>"); 
    cl.print("<inputs>"); 


    // button LED states 
    // LED3 
    cl.print("<LED>"); 
    if (LED_state[0]) { 
     cl.print("on"); 

    } 
    else { 
     cl.print("off"); 

    } 
    cl.println("</LED>"); 
    // LED4 
    cl.print("<LED>"); 
    if (LED_state[1]) { 
     cl.print("on"); 
    } 
    else { 
     cl.print("off"); 
    } 
    cl.println("</LED>"); 

    // new led 
    cl.print("<LED>"); 
    if (LED_state[2]) { 
     cl.print("on"); 

    } 
    else { 
     cl.print("off"); 

    } 
    cl.println("</LED>"); 

    cl.print("</inputs>"); 
} 


// sets every element of str to 0 (clears array) 
void StrClear(char *str, char length) 
{ 
    for (int i = 0; i < length; i++) 
    { 
     str[i] = 0; 
    } 
} 

// searches for the string sfind in the string str 
// returns 1 if string found 
// returns 0 if string not found 
char StrContains(char *str, char *sfind) 
{ 
    char found = 0; 
    char index = 0; 
    char len; 

    len = strlen(str); 

    if (strlen(sfind) > len) { 
     return 0; 
    } 
    while (index < len) { 
     if (str[index] == sfind[found]) { 
      found++; 
      if (strlen(sfind) == found) { 
       return 1; 
      } 
     } 
     else { 
      found = 0; 
     } 
     index++; 
    } 

    return 0; 
} 

回答

0

根據您的問題描述...有可能您的內存不足。當然,這只是一種可能性。嘗試使用FreeMemory庫來監視內存利用率。如果每次發送命令時內存的數量都會下降,那麼你就有了答案。

請注意,Arduino草圖在使用最後一個內存(通常)時會失敗。堆棧覆蓋某些數據區域,並且草圖以某種方式變得瘋狂。

當然,您需要使用串行監視器運行草圖來查看FreeMemory輸出。加入一些Serial.print語句也可能有助於確定草圖的確切位置

好主意。

0

使用Arduino遠程控制電磁閥時,我遇到過類似的問題。我發現,問題源於接收HTML請求,而Arduino仍然將其網頁發送給客戶端。

查看代碼是否仍然掛起,如果在請求之間給它幾秒鐘;如果是這樣,請儘量減少傳輸的網頁,或確保在傳輸服務器的答覆完成之前不會發出任何請求。

0

我有類似的問題,我有一個Web服務器,需要每24小時重新啓動。這使它在一年內穩定地工作。最近我一直試圖擺脫重啓解決方案,並可能找到更好的解決方案。我也看了通常的s,禁用sd卡,空閒內存,dchp內存泄漏,路由器ip租約時間和其他一堆。所有這些都變成了紅鯡魚,並沒有改善穩定性。最後,我嘗試在主循環中包括ethernet.begin和server.begin,並且現在已經工作了一個多星期而沒有重新啓動。我建議每隔一小時或每天開始這些線路而不是連續不斷。當millis溢出時可能是一個問題,目前暫時還沒有評論,因爲大約40天后。