Go Down

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

gpb01

... se viene effettuata la scrittura sei uscito dal while e se sei uscito dal while ... o hai premuto CR o hai battuto più di (SIZE-1) caratteri.

Oppure ... hai programmato male il Serial Monitor e LUI trasmette il CR ... guarda in basso, a sinistra della velocità, ci deve essere "no line ending" ... altrimenti ...

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

tntsix

Questo è lo skatch

Code: [Select]
#define SIZE 300
  //
int i = 0 ;
char temp[SIZE];
//

    if(keyboard.available()) {
      while(1) {
   char d = keyboard.read();
    Serial.print(d);
    if(d =='\n') break;
    temp[i]=d;
    i++;
    if(i=(SIZE-1)) break;   
  }
//
temp[i]=0x00;
//
    Myfile=SD.open("test.txt",FILE_WRITE);
    Myfile.print(temp);
    Myfile.close();
}


Ma continua ad uscire dal ciclo while.....e non ho premuto nessun invio purtroppo.......per quanto riguarda il monitor seriale c'è scritto nessun fine riga per cui immagino che vada bene .....

Come hai detto tu il problema è che esce dal ciclo while

gpb01

tntsix ... lo credo !!!
Legge a raffica chissà cosa ... visto che hai messo il if(keyboard.available()) FUORI dal while() ...  :smiley-roll:

Comincia a controllare, dentro al while() che ci sia veramente qualche cosa da leggere e, solo se c'è, leggere e fare il resto !

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

tntsix

Perfetto....la scrittura ora funziona correttamente.....quando premo invio da tastiera viene effettuata la scrittura sulla SD......
Per verificare l'effettiva scrittura sulla SD ho semplicemente messo la Sd nel computer e ho visto che scrivendo sul serial monitor senza premere invio non veniva memorizzato nulla sulla Sd, mentre scrivendo su monitor seriale e premendo invio la scrittura veniva effettuata!!!
il problema però è che non riesce a caricarlo piu in rete il file di testo in questa maniera!!!!

nid69ita

#19
Jul 09, 2014, 03:58 pm Last Edit: Jul 09, 2014, 04:02 pm by nid69ita Reason: 1

Code: [Select]

  if(keyboard.available())
 {
   while(1)
   {
     ......
     if(i==(SIZE-1)) break;    
   }
 }



Consiglio, metti le graffe aperte su riga nuova e poi usa il tasto CTRL+T nell'IDE. Magicamente avrai l'indentazione che ti fa capire cosa c'e' nei blocchi e le graffe aperte/chiuse che sono nelle stesse colonne.  ;)
my name is IGOR, not AIGOR

nid69ita

ERRORONE:
Code: [Select]
if(i=(SIZE-1)) break;
my name is IGOR, not AIGOR

gpb01

Attento tntsix, come ti segnala Nid, c'è un errore di battitura, manca un '=' nel IF e quindi l'uscita per il superamento dei caratteri nel buffer NON funziona. Correggilo ...

Code: [Select]
if(i == (SIZE-1)) break;

Invece ... cosa intendi per :  "... il problema però è che non riesce a caricarlo piu in rete il file di testo in questa maniera!!!!" ???

Se il file viene scritto correttamente, evidentemente lo stai leggendo o nel modo sbagliato e nel momento sbagliato ...  :smiley-roll:

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

tntsix

#22
Jul 09, 2014, 04:41 pm Last Edit: Jul 09, 2014, 04:43 pm by tntsix Reason: 1
Si Gugliemo gia me ne ero accorto di quell'errore infatti sto lavorando solo con doppio uguale. Addirittura ho inglobato il tutto cosi
Code: [Select]

if(d =='\n' || i==(SIZE-1)) break;


Per quanto riguarda l'immissione in rete ci sto ancora lavorando....da quando ho modificato il codice ho iniziato ad avere problemi....riporto il codice relativo all'immissione in rete del file:

Code: [Select]

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());
           }
           // close the file:
           Myfile.close();
         }
         break;
       }
       if (c == '\n') {
         currentLineIsBlank = true;
       }
       else if (c != '\r') {
         currentLineIsBlank = false;
       }
     }
   }
   delay(1000);
   client.stop();
 }



gpb01

Ho idea che il problema sia nel fatto che, se esamini bene il mio while(), il carattere '\n' NON viene messo nell'array, ma la stringa viene terminata (come si devono terminare le stringhe) con lo 0x00.

Ora vedo che tu, nel codice, vai invece a cercare il CR ... ad esempio qui :

Code: [Select]
        if (c == '\n') {
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          currentLineIsBlank = false;
        }


... ma non lo troverai mai  :smiley-roll:  magari è questo che ti crea il problema ? Come usi quella flag currentLineIsBlank ?

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

tntsix

Verifica la comunicazione con il client e ricevendo una linea vuota (\n) reimpostano la currentLineIsBlank a true, in caso di ricezione di un carriege return (\r) impostano a false la stessa, impedendo al ciclo successivo di reinviare nuovamente gli header e il file già inviato!!!

E' cio che ho trovato in un sito....viene usato questo metodo in molto sketch!

gpb01

Ah ... ok, quindi non la vai a cercare nel testo ... meglio  XD

Allora non so, ma che genere di problemi incontri ???

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

tntsix

Riporto passo passo cio che succede:

1) Scrivo su montior seriale una parola (ciao ad esempio) senza premere invio....e giustamente sul client non appare nulla quando tento di connettermi.......premo invio e sul client compare ciao -> tutto ok

2) scrivo un altra parola sul monitor seriale e premo invio......inizialmente il client nn riesce a connettersi.....allora premo altre volte invio dalla mia keyboard PS2 e il client dopo svariati tentativi fa l'accesso alla SD

3) come il punto 2) per altre parole inserite

leo72


Grazie per la dritta Nid !!! la prox volta metto il codice correttamente

Bastava che tu editassi i tuoi post (come ho fatto io  :smiley-roll-blue: ) e racchiudessi il codice come ti era stato suggerito.

gpb01


Riporto passo passo cio che succede:


... più che altro riporta l'intero codice (... mi raccomando, racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone # ... terzultimo della seconda fila) che, con i soli frammenti che riporti, non si ha una visione globale del programma e di ciò che fai.

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

tntsix

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();
  }
}


Questo è lo sketch

Go Up