Go Down

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

tntsix

Jul 09, 2014, 09:55 am Last Edit: Jul 16, 2014, 09:27 am by tntsix Reason: 1
Salve a tutti ragazzi

Avrei bisogno di un consiglio da parte vostra....
Sto utilizzando arduino uno con ethenet shield  e quello che vorrei fare è scrivere con una tastiera PS2 su la micro sd e mettere in rete il file di testo che ho creato
Tutto ciò è stato fatto abbastanza agevolmente, ma il problema che ho è il seguente:
Nel momento in cui scrivo con la mia tastiera PS2 (collegata ad arduino con libreria PS2Keyboard) stampo correttamente i caratteri sul monitor seriale, ma contemporaneamente scrivo anche sul file di testo nella SD e quindi sostanzialmente chi si connette in rete al mio arduino legge automaticamente i caratteri che ho digitato (aggiornando la pagina ovviamente). Quello che vorrei fare è inserire il tasto invio dalla mia tastiera, ovvero fare in modo che il contenuto del mio file di testo sia reso disponibile a chi legge nel momento in cui premo invio dalla mia PS2Keyboard.
Cio che ho pensato di fare è copiare all'interno di un array di caratteri tutti i tasti che ho digitato da tastiera e attraverso un if else dare il consenso alla scrittura sul file txt dell'array di caratteri. Di seguito riporto la parte di sketch che ho pensato di fare:

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

if(keyboard.available()) {

char d= keyboard.read();
Serial.print(d);

if(d!='\n') {
temp[i]=d;
i++;}
else
{
File=SD.open("prova.txt",FILE_WRITE);
File.print(temp);
File.close();
}


Il problema è che sul monitor del client non leggo i caratteri correttamente, ma cose strane :D ........Qualche consiglio ?

cyberhs

Mi sembra ci sia un errore nell'assegnazione del vettore temp:
Code: [Select]

  if (d != '\n') {
    temp[i] = d;
    i++;
  }

tntsix

Si si la dicitura corretta è quella che lei ha appena scritto

In ogni caso ora il problema è cambiato....effettivamente l'if else scritto in questa maniera funziona, ma il problema è la copia dei caratteri all'interno dell'array....infatti la stampa che ottengo è sempre l'ultima lettera di cio che digito dalla PS2Keyboard

gpb01

tntsix, ricordati che le stringhe del C (array di char) DEVONO essere sempre null-terminated ovvero DEVONO avere come ultimo carattere 0x00. Quindi, quando ricevi il CR nell'array devi inserire 0x00.

Comunque ... io farei, dopo i++; anche un controllo sul valore di i perché se supera (SIZE-1) ovvero hai scritto (SIZE) caratteri, sfori di memoria ed ciò che fa il programma non è più prevedibile  :smiley-roll:

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

tntsix

#4
Jul 09, 2014, 10:47 am Last Edit: Jul 10, 2014, 07:23 am by leo72 Reason: 1
Stavo pensando anche a questo Gugliemo (ti do del tu perdonami )

Ma mi è venuta un idea.......potrei utilizzare le stringhe di arduino, ovvero fare una cosa del tipo

Code: [Select]
String string;
int i=0;
//lettura keyboard e memorizzazione nella variabile d
if(d!='\n') {
string.setcharAt(i,d);
i++;}
else
// scrittura su SD di string
}


solo che non mi riconosce la funzione setcharAt....probabilmente sarà cambiata

gpb01

Avrò detto mille volte di NON utilizzare la classe String !!!  :0

NON sei su un PC dove c'è un sistema operativo ed un "garbage collector", sei su una piccola MCU con solo 2KBytes di SRAM, dove devi fare tutto tu e dove usare la classe "String", a causa dell'allocazione e riallocazione dinamica della memoria, porta quasi sempre ... a sicuri problemi !  ]:D

Fino a quando non siete obbligati (a causa di una libreria esterna che vuole necessariamente tale classe) evitatela ed usate le stringhe classiche del C :)

Guglielmo

P.S. : ... tranquillo, qui ci diamo tutti del tu ;)

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

tntsix

Ok allora utilizzo i vettori di caratteri, impelmentando il null ('\0')....vediamo che ne esce fuori.

gpb01

#7
Jul 09, 2014, 11:02 am Last Edit: Jul 09, 2014, 04:30 pm by gpb01 Reason: 1
Dovresti provare una cosa del genere :

Code: [Select]
char d;
...
...
i = 0;
while (true) {
  d = keyboard.read();      // leggi un carattere
  Serial.print(d);          // lo visualizzi sul monitor
  if (d == '\n') break;     // se è CR esci dal while
  temp[i]=d;                // ... altrimenti lo metti nell'array
  i++;                      // incrementi l'indice
  if (i == (SIZE-1)) break; // se l'indice è al massimo esci
}
temp[i]=0x00;                // alla posizione dell'indice metti il terminatore di stringa
//
File=SD.open("prova.txt",FILE_WRITE);
File.print(temp);
File.close();


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

tntsix

perdonami Gugliemo ma non bisognerebbe mettere il terminatore di stringa nella posizione temp[i+1]?

nid69ita

@tntsix, il codice DEVE essere racchiuso nei tag code. Vedi sezione 7 del regolamento, spiega bene come fare.
Altrimenti parte del codice può essere interpretato male. Soprattutto le quadre.
Vedi questo tuo primo post, a un certo punto il codice perde un pezzo e diventa in italico.
my name is IGOR, not AIGOR

tntsix

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

nid69ita


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

Prego  :smiley-mr-green:


perdonami Gugliemo ma non bisognerebbe mettere il terminatore di stringa nella posizione temp[i+1]?

No, i all'uscita dal while è già andato in posizione successiva, in quanto aumenti i con i++ e poi fai il test per uscire dal while.
my name is IGOR, not AIGOR

tntsix

Vero vero!!!!! avete ragione!

gpb01


Vero vero!!!!! avete ragione!


Ne dubitavi ???  :smiley-eek: :smiley-eek: :smiley-eek:

Scherzo ovviamente ...  :smiley-mr-green: :smiley-mr-green: :smiley-mr-green:

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

tntsix

Nono ci mancherebbe :D

Comunque con il tuo codice Gugliemo sono riuscito a copiare i caratteri della tastiera all'interno di un array e a stamparlo sulla SD.......il problema è che il tasto invio non ha alcun effetto, nel senso che cio che si vede sui client (i pc connessi alla rete) è effettivamente cio che ho scritto sul monitor seriale però su due variabili distinte (il vettore di caratteri per il client e la tastiera per il monitor seriale), ma ho trasparenza tra le due cose, nel senso che anche se non premo il tasto invio, la scrittura su Sd viene effettuata

Go Up