2014-02-27 52 views
0

使用以太網WebServer示例代碼,我已經讓我的arduino託管存儲在SD卡上的網站。該網站使用jQuery將網頁瀏覽器中的鼠標位置發回到arduino。我最終想用這個信息來控制一個伺服電機,但是,我遇到的問題是,void loop的每次迭代中的client.stop行會在鼠標移動和arduino獲取之間產生很大的滯後時間信息。以太網網絡服務器示例,client.stop導致延遲時間問題

有沒有辦法讓這段代碼只在鼠標停止移動時使用執行stop.client行。那麼有效的時候,沒有信息通過post方法發送到arduino?

這是我的代碼。

#include <SPI.h> 
#include <Ethernet.h> 
#include <SD.h> 

String POST = ""; 
int count = 0; 
const int chipSelect = 4; 

// Enter a MAC address and IP address for your controller below. 
// The IP address will be dependent on your local network: 
byte mac[] = { 
    0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; 
IPAddress ip(192,168,178,30); 

// Initialize the Ethernet server library 
// with the IP address and port you want to use 
// (port 80 is default for HTTP): 
EthernetServer server(80); 
EthernetClient client; 

void setup() { 

     // Open serial communications and wait for port to open: 
     Serial.begin(9600); 
     Serial.setTimeout(10); 

     //start the Ethernet connection and the server: 
     Ethernet.begin(mac, ip); 
     client.setTimeout(1); 

     server.begin(); 
     Serial.print("server is at "); 
     Serial.println(Ethernet.localIP()); 

     //SD card stuff 
     Serial.print("Initializing SD card..."); 
     // see if the card is present and can be initialized: 
     if (!SD.begin(chipSelect)) { 
      Serial.println("Card failed, or not present"); 
      // don't do anything more: 
      return; 
     } 
     Serial.println("card initialized."); 
} 

void loop() { 
     // listen for incoming clients 
     EthernetClient client = server.available(); 
     if (client) { 
      Serial.println("new client"); 

      // an http request ends with a blank line 
      boolean currentLineIsBlank = true; 
      while (client.connected()) { 
       if (client.available()) { 
        char c = client.read(); 

        // if you've gotten to the end of the line (received a newline 
        // character) and the line is blank, the http request has ended, 
        // so you can send a reply 
        if (c == '\n' && currentLineIsBlank) { 
        // send a standard http response header 

         String POST = ""; 

         while(client.available()){ 
          c = client.read(); 
          // save the variables somewhere 
          POST += c; 
         } 

         if(POST != ""){ 
           Serial.println(POST); 
         } 

         //load html/css/js for website only once 
         if (count <= 0){ 

          client.println("HTTP/1.1 200 OK"); 
          client.println("Content-Type: text/html"); 
          client.println("Connection: close"); // the connection will be closed after completion of the response 
         //client.println("Refresh: 5"); // refresh the page automatically every 5 sec 
          client.println(); 

          File dataFile = SD.open("site.txt"); 
          // if the file is available, write to it: 
          if (dataFile) { 
           while (dataFile.available()) { 

            //Serial.write(dataFile.read()); 
            client.write(dataFile.read()); 
           } 
           dataFile.close(); 
          } 
          // if the file isn't open, pop up an error: 
          else { 
           Serial.println("error opening site.txt"); 
          } 
         } 

         //count = 1; 
         break; 

        } 

        if (c == '\n') { 
         // you're starting a new line 
         currentLineIsBlank = true; 
        } 
        else if (c != '\r') { 
         // you've gotten a character on the current line 
         currentLineIsBlank = false; 
        } 
       } 
      } 
      // give the web browser time to receive the data 

      if (count == 0){ 
      delay(500); 
      } 
      else{ 
      delay(1); 
      } 
      count=1; 

      // close the connection: 
      client.stop(); 
      Serial.println("client disonnected"); 
     } 
} 

回答

1

是的,是可能的,但真的很難,因爲你必須實現HTTP \ 1.1,這也將reamin緩慢,因爲每一個鼠標的位置,瀏覽器必須發送一個完整的HTTP請求,Arduino的閱讀和intepretate它。

最好的解決方案是使用websocket(已經有一些針對arduino的serbsocket服務器lybrary),一旦websocket設置好了,您就可以像串口一樣進行雙向通信!