echo ABC > /dev/ttyUSB0

Come da oggetto, vorrei inviare la stringa ABC ad arduino.
Purtroppo Arduino legge solo la prima stringa e si mangai le altre.

Ho provato in mille modi diversi.
Un esempio di codice è:

   ....
    inByte = Serial.read();
    if (inByte == '#') {

      while (pointer < 2) { // accumulate 6 chars
        buffer[pointer] = Serial.read(); // store in the buffer
        pointer++; // move the pointer forward by 1
      }

Purtroppo buffer[0] e [1] restano vuoti.

Ho provato anche settando la porta in questo modo:

stty -F /dev/ttyUSB0 cs8 9600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts

Grazie

ciao jumpingj,

non é un problema della seriale o di linux, ma una difficoltá generale del "C".

Col seguente codice l' arduino aspetta che riceve 4 caratteri:

do {
     if (Serial.available()) {
       Data[i] = Serial.read();
     i++;
     }
   } while (i<4);

per avere una stringa valida devi aggiungere un "0" come ultimo carattere della stringa:
Data[4]=0;

per convertire la stringa in un numero serve:

valore = atof(Data);

ciao Uwe

Grande uwefed,
mi hai risolto molto.
Purtroppo ora mi trovo di nuovo incartato.
Utilizzando quest codice:

// Example 08B: Arduino Networked Lamp
//
// Copy and paste this example into an empty Arduino sketch

int val = 0; // variable to store the value coming from the sensor

int btn = LOW;

int old_btn = LOW;
int state = 0;
char buffer[7] ;
int pointer = 0;
byte inByte = 0;



void setup() {
  Serial.begin(9600);  // open the serial port
}

void loop() {
    // If the marker's found, next 6 characters are the colour
    
  do {
     if (Serial.available()) {
       buffer[pointer] = Serial.read();
     pointer++;
     }
   } while (pointer<4);
   pointer = 0;
   buffer[4]=0;
   val = atof(buffer); 

   if (val == 1234) 
    digitalWrite(13, HIGH);
    else
    digitalWrite(13, LOW);    
}

e lanciando il comando da terminale

 echo "1234" > /dev/ttyUSB0

Il risultato è che intercetta 1234 correttamente ma solo una volta ogni 4

Ho provato ad inviargli delle stringhe diverse e il led non si accende mai.
Ho provato ad inviare stringhe più lunghe (che iniziano sempre per 1234) ma continua ad accendersi sempre una ogni quattro.

Qundi il problema no è nella stringa, bensì nel loop.

Avete qualche idea per farlo funzionare sempre ?

ciao jumpingj
A me funziona perfettamente e ogni volta. Devo dire che ho win XP come sistema operativo e uso come terminale quello del IDE.
Il mio dubbio: Il terminale manda come ultimo carattere un "carrige return" e/o un "line feed"?
Hai provato di usare il terminale del IDE o questo non é possibile con Linux?
Per una ricerca di errore rimanda sulla seriale i dati che ti arrivano.

Per incominciare aggiungi dopo la riga
val = atof(buffer);
questo
Serial.println(val);
e vedi che numero Ti ritorna.

Come secondo passo per veder poi i singoli caratteri convertili in numero e spediscili al terminale:
dopo buffer[pointer] = Serial.read();
aggiungi:
val= int( buffer[pointer]);
Serial.print(val); Serial.print(" ");
cosi vedrai il valore ashii del carattere che mandi.
Dovresti trovare: 49 50 51 52 1234

Ciao Uwe

codice completo:

// Example 08B: Arduino Networked Lamp
//
// Copy and paste this example into an empty Arduino sketch

int val = 0; // variable to store the value coming from the sensor

int btn = LOW;

int old_btn = LOW;
int state = 0;
char buffer[7] ;
int pointer = 0;
byte inByte = 0;



void setup() {
  Serial.begin(9600);  // open the serial port
}

void loop() {
    // If the marker's found, next 6 characters are the colour

  do {
     if (Serial.available()) {
       buffer[pointer] = Serial.read();
     val= int( buffer[pointer]);
     Serial.print(val);  Serial.print(" ");
     pointer++;
     }
   } while (pointer<4);
   pointer = 0;
   buffer[4]=0;
   val = atof(buffer);
   
   Serial.println(val);

   if (val == 1234)
    digitalWrite(13, HIGH);
    else
    digitalWrite(13, LOW);
}

Sei un genio :wink:

In effetti a fine stringa mi trovo il carattere che corrisponde al numero 10

Quindi nel primo loop mi trovo
49 50 51 52 1234 ON
il secondo
10 49 50 51 52 234 e fallisce !!!
...
ecco perchè funzionava una volta ogni 4!!!

Per correggere temporaneamente ho aggiunto un Serial.read() dopo il loop. Funziona ma non mi convince a livello di stabilità

Pensavo di studiare una soluzione con un carattere che indica l'inizio della mia stringa.

Grazie !!!!
jumpingj

ciao jumpingj
non sono un genio, ho solo un po di esperienza nella ricerca guasti, sopratutto elettronici, elettrotecnici ecc dato dal mio lavoro di tecnico manutentore su tante attrezzature diverse e di tanti produttori diversi.
La cosa piú semplice é che non leggi 4 carateri ma 5.
Poi se ho capito il dato lo dai in questo momento con un terminale ma alla fine l'origine del dato trasmesso sará diverso.
Ciao Uwe