Go Down

Topic: [RISOLTO] Implementazione tasto invio (Read 23605 times) previous topic - next topic

tntsix

Praticamente il problema penso sia dovuto al fatto che manca sincronizzazione tra client e server......ho fatto alcune prove e succede che il messaggio che scrivo al client arriva, ma dopo aver premuto diverse volte il tasto invio......è come se io debba premere invio nel momento in cui il client tenta la connessione.....

gpb01

Il codice cortesemente mettilo in ordine utilizzando l'apposita funzione del IDE ... Tools -> Auto Format :

Code: [Select]

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

#define KBD_CLK_PIN  3
#define KBD_DATA_PIN 2
#define SIZE 300

PS2Keyboard keyboard;
//
File Myfile;
//
byte mac[]={
   0x90, 0xA2, 0xDA, 0x0F, 0x41, 0xD3};
IPAddress ip (192,168,1,238);
EthernetServer server(80);
//

void setup ( )
{
   //
   Serial.begin(9600);
   Serial.println("Inizializzazione tastiera.....attendere prego");
   Serial.println();
   //
   Ethernet.begin(mac, ip);
   server.begin();
   //
   delay(3000);
   //
   if (!SD.begin(4))
   {
      Serial.println("Inizializzazione fallita......controllare la SD");
      return;
   }
   if (SD.exists("test.txt")) {
      SD.remove("test.txt");
   }
   keyboard.begin(KBD_DATA_PIN);
   Serial.println("Immettere messaggio....");

   delay(1000);
}

void loop ( )
{
   int i=0;
   char temp[SIZE];
   //
   while(1){
      if(keyboard.available()) {
         //
         char d = keyboard.read();
         //
         Serial.print(d);
         //
         if(d =='\n' || i==(SIZE-1)) break;
         temp[i]=d;
         i++;
      }
      temp[i]=0x00;
   }
   Myfile=SD.open("test.txt",FILE_WRITE);
   //
   Myfile.print(temp);
   Myfile.close();
   //
   delay(1000);
   //
   EthernetClient client = server.available();
   if (client) {
      boolean currentLineIsBlank = true;
      while (client.connected()) {
         if (client.available()) {
            char c = client.read();
            if (c == '\n' && currentLineIsBlank) {
               client.println("HTTP/1.1 200 OK");
               client.println("Content-Type: text/html");
               client.println();
               Myfile = SD.open("test.txt", FILE_READ);
               if (Myfile) {
                  while (Myfile.available()) {
                     client.write(Myfile.read());
                  }

                  Myfile.close();
               }
               break;
            }
            if (c == '\n') {
               currentLineIsBlank = true;
            }
            else if (c != '\r') {
               currentLineIsBlank = false;
            }
         }
      }
      delay(1);
      client.stop();
   }
}


Alcune domande ...

linea 43 : a che serve quel delay(1000) messo li così ???  casomai può avere una certa utilità mess come PRIMA istruzione del setup() per dare eventualmente tempo a "bootloader", così non serve a nulla !

linea 69 : di nuovo, a che serve quel delay(1000) messo li così ???

Mi chiedo poi ... lo scopo di mettere l'array su SD e poi rileggere gli stessi valori da SD ??? perché non usi direttamente la stringa che è già presente nell'array ???

Guglielmo
Search is Your friend ... or I am Your enemy !

tntsix

Cosa intendi per la stirnga gia presente sulla SD?? :smiley-sweat:

I delay invece gia li ho tolti........ :)

gpb01

Scusa ... tu ricevi i caratteri uno ad uno e li metti nella stringa temp e, correttamente, la termini con 0x00, quindi, a tutti gli effetti, all'uscita del while, l'array temp contiene la tua serie di caratteri giustamente null-termitated.

Tu predi questa serie di caratteri, la scrivi su SD, chiudi l'SD, la riapri in lettura, leggi la serie di caratteri che hai appena scritto e li trasmetti ...  :smiley-eek:

Ora ... visto che comunque gli stessi caratteri li hai sempre dentro a temp ... ma perché non eviti la SD ed usi direttamente temp ???  :smiley-roll:

Guglielmo
Search is Your friend ... or I am Your enemy !

tntsix

In pratica dici di passare al client direttamente temp evitando l'utilizzo della SD?

gpb01

Tu spiegami a che cosa serve la SD ... A me, attualmente, sembra serva solo a creare casino e perdere tempo ...  :smiley-roll:

Guglielmo
Search is Your friend ... or I am Your enemy !

tntsix

Perdona la mia ignoranza......ma se su un client passo direttamente temp..........i PC stamperanno a video direttamente i caratteri memorizzati dentro temp?
Perche francamente non sono riuscito a fare questa cosa, per questo motivo mi sono buttato subito sulla SD, in modo da poter scrivere su un file di testo creato nella SD ........
Se non apro un file di testo come faccio a visualizzare i caratteri da me memorizzati dentro temp?

gpb01

Così :

Code: [Select]

if (c == '\n' && currentLineIsBlank) {
   client.println("HTTP/1.1 200 OK");
   client.println("Content-Type: text/html");
   client.println();
   client.println(temp);
   break;
}


... ti sembra così strano ? temp è una variabile che, ripeto, contiene una stringa, quindi stai semplicemente trasmettendo quella stringa.

Guglielmo
Search is Your friend ... or I am Your enemy !

tntsix

Ok ho fatto come mi hai detto....ma il problema sussiste....riesco a visualizzare la prima stringa che immetto dopo invio, ma le altre no......

gpb01

Ok, già è qualche cosa ... almeno elimini tutta la INUTILE parte SD  :smiley-mr-green:

Per il resto ... probabilmente c'è un errore di logica nella parte Ethernet ...  :smiley-roll:

Ma non ho capito ... dall'altra parte (non Arduino) ... chi è che fa le richieste sulla rete per leggere i dati ? Un tuo programma ? Che tipo di richieste fa ? Quando ? Come ?

Guglielmo
Search is Your friend ... or I am Your enemy !

tntsix

sono tanti computer connessi alla rete.......praticamente uno (o piu) client (i PC) si collegano ad arduino digitando semplicemente l indirizzo IP da browser (che sia Google Chrome, Explorer o FireForx).....in questo modo esce sulla pagina di richiesta semplicemente il messaggio digitato da tastiera

gpb01

OK, quindi Arduino fa da WebServer e quello che restituisce è una pagina con dentro il valore della variabile "temp" ...  XD

Io ripartirei dall'esempio Ethernet -> WebServer, lo proverei per vedere se ti funziona sempre bene e ricomincerei a fare le modifiche su quello ... non vorrei che a forza di fare prove, tra la SD e altro, tu abbia omesso o modificato qualche cosa ;)

Ah, se la SD NON la usi, ricordati di mettere HIGH il pin di SS altrimenti disturba l'Ethernet, difatti, come da reference dell'Ethernet Shield :

Quote
If you're not using one of the peripherals in your program, however, you'll need to explicitly deselect it. To do this with the SD card, set pin 4 as an output and write a high to it.


Guglielmo
Search is Your friend ... or I am Your enemy !

gpb01

Altra cosa ...
... se guardi attentamente il tuo loop() ti accorgi che ... leggi la tastiera e solo dopo passi alla verifica della richiesta ethernet, la assolvi e ... il loop si chiude e torna a leggere la tastiera ... bloccando, di fatto, la possibilità di risposte  :smiley-roll:

La cosa va gestita in modo più complesso, con due buffer (uno che legge la tastiera in tempo reale e uno che è quello dove, quando fai CR viene copiato il primo buffer) ed in modo da NON bloccare mai il ciclo loop().

Guglielmo
Search is Your friend ... or I am Your enemy !

tntsix

Praticamente tu dici che occorre copiare all'interno di un array di caratteri i tasti digitati da tastiera (ovvero il temp che uso io)
e un secondo array che copia il contenuto dell array temp, ma comprensivo del tasto invio?

gpb01

NO, dico che devi immaginare una "logica NON bloccante" .. quella di adesso è una logica bloccante, come passi dal "via" (... reminiscenze di monopoli  :smiley-mr-green: :smiley-mr-green: :smiley-mr-green:) finisci in un while dal quale NON esci fino a quando non premi CR o il buffer è pieno ... questo è bloccante e quindi ... la parte ethernet NON viene eseguita.

Devi ridisegnare TUTTA la logica del programma in modo che NON avvengano mai condizioni di blocco ...
... fatti dei bei diagrammi di flusso perché non è difficile, ma neanche banalissimo.

Guglielmo
Search is Your friend ... or I am Your enemy !

Go Up