Inviare comandi su seriale

Salve amici di Arduino,sto cercando di fare un circuito che usa la seriale,ma mi fermo su un problema, che cerco di spiegare:

invio comandi da serialMonitor tipo lettera A /////// mi attiva una uscita e funziona

se scrivo Serial.write("A"); /////// non accade niente

ho provato anche a salvare la lettera su una variabile e poi con il comando Serial.write(......); non va, cosa mi sfugge????

Prova:

Serial.print("A");

o

Serial.println("A");

non funziona, ci sto impazzendo : Smiley-confuse:

Ma il Serial.begin() per inizializzare la porta seriale, lo hai fatto ? ? ?

Metti il codice che non ti funziona (… mi raccomando, in conformità al regolamento, punto 7, racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone </> … primo a sinistra) …

Guglielmo

  //Ricezzione dati da seriale Arduino
  while (Serial.available() > 0)  //// se maggiore di zero inizzio a leggere
  {

    char dato1 = Serial.read(); // "dato" è il valore che viene ricevuto dalla seriale


    switch (dato1)
    {
      
        }
      case 'S': // ricezione per scenario magico
        {
          Serial.print("ok");
          ciao = 1;

          break;

        }

tutto qui tutto ok

//////////////////dopo che attivo con S mi attiva questa funzione che attende comandi da seriale//////
 inputSize = 0;
  if (Serial.available() > 0 && ciao == 1)
  {
    delay(300);
    //int Rele = Serial.parseInt();
    inputSize = Serial.available();

    //Serial.print("inputSize=");
    Serial.println(inputSize);
    //Serial.print(Rele);
    for (int i = 0; i < inputSize; i++)
    {
      myCmd[i] = Serial.read();
    }
    //Serial.print("I received: ");
    Serial.println(myCmd);         //// mi indica quando lwettere e composta la frase
    //Serial.write(myCmd);
    Serial.println(myCmd[0]);
    Serial.println(myCmd[1]);
    Serial.println(myCmd[2]);
    Serial.println(myCmd[3]);
    Serial.println(myCmd[4]);
    Serial.println(myCmd[5]);
    Serial.println(myCmd[6]);
    Serial.println(myCmd[7]);
   //Serial.write(myCmd);   ///// scrivo in seriale i comandi ON-OFF
    //Serial.println(myCmd[25]);
    Serial.println("visionedato");
    ciao = 0;

  }


spero che si capisca un po!!!!!!

Non hai risposto alla mia domanda ed hai messo solo pezzi di codice che non servono ...

Guglielmo

ok ci provo

AuAnWeb:
ok ci provo

… ci provi … a che fare ? ? ? :o :o :o

Guglielmo

#include <EEPROMex.h>
#include "Arduino.h"

int inByte = 0;
char myCmd[50];
int inputSize = 0;
long ciao = 0;



const int ledPin1 = A0;      //  LED pin
const int ledPin2 = A1;      //  LED pin
const int ledPin3 = A2;      //  LED pin
const int ledPin4 = A3;      //  LED pin




void setup() {
  // put your setup code here, to run once:

  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);

  Serial.begin(9600);





}

void loop() {
  // put your main code here, to run repeatedly:



  //Ricezzione dati da seriale Arduino
  while (Serial.available() > 0)  //// se maggiore di zero inizzio a leggere
  {

    char dato1 = Serial.read(); // "dato" è il valore che viene ricevuto dalla seriale


    switch (dato1)
    {
      case 'A': // Se ricevo la lettera A,
        {
          digitalWrite(ledPin1, LOW);
          Serial.print("1");
          break;
        }
      case 'B': // Se ricevo la lettera a
        {
          digitalWrite(ledPin2, LOW);
          Serial.print("2");
          break;
        }
      case 'C':
        {
          digitalWrite(ledPin3, LOW);
          Serial.print("3");
          break;
        }
      case 'D':
        {
          digitalWrite(ledPin4, LOW);
          Serial.print("4");
          break;
        }

      case 'S': // ricezione per scenario magico
        {
          Serial.print("OK");
          ciao = 1;

          break;

        }
    }
  }
  inputSize = 0;
  if (Serial.available() > 0 && ciao == 1)
  {
    delay(300);
    //int Rele = Serial.parseInt();
    inputSize = Serial.available();

    //Serial.print("inputSize=");
    Serial.println(inputSize);
    //Serial.print(Rele);
    for (int i = 0; i < inputSize; i++)
    {
      myCmd[i] = Serial.read();
    }
    //Serial.print("I received: ");
    Serial.println(myCmd);         //// mi indica quando lettere e composta la frase
  
    Serial.println(myCmd[0]);
    Serial.println(myCmd[1]);
    Serial.println(myCmd[2]);
    Serial.println(myCmd[3]);
    Serial.println(myCmd[4]);
    Serial.println(myCmd[5]);
    Serial.println(myCmd[6]);
    Serial.println(myCmd[7]);
   
    Serial.println("visionedato");
    ciao = 0;

  }






}

ma quando postate LEVATE quei 4 kg di righe vuote che NON servono, cavolo !!
Comunque, già questo mi pare sospetto: while (Serial.available() > 0)
se c'e' un ciclo e stai spedendo il comando di attivazione (prima parli di A nel codice S... mah!!) mi sa che il programma stà ancora girando in questo ciclo.

Inoltre lo switch NON devi mettere le graffe per ogni case, sono inutili

P.S.
print spedisce del testo, print("A") -> 'A' print(65) -> '6' e poi '5' come testo
write spedisce dei byte write("A") -> 'A' write(65) -> 65 o come ascii 'A'

Spero che avete capito la mia idea di comandare la seriale

scusa nid69ita hai ragione dei 4Kg di sporcizia.

Il comando S mi serve per ragrupare piu lettere insieme.

while (Serial.available() > 0)

dici che rimane attivo da non poter ascoltare

if (Serial.available() > 0 && ciao == 1)

????

come consiglio dato, ho modificato il codice:

#include "Arduino.h"
int inByte = 0;
char myCmd[8];
int inputSize = 0;
long ciao = 0;
const int ledPin1 = A0;      // the number of the LED pin
const int ledPin2 = A1;      // the number of the LED pin
const int ledPin3 = A2;      // the number of the LED pin
const int ledPin4 = A3;      // the number of the LED pin

void setup() {
 
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);

  Serial.begin(9600);

}

void loop() {

  if (Serial.available() > 0)  //// se maggiore di zero inizzio a leggere
  {
    char dato1 = Serial.read(); // "dato" è il valore che viene ricevuto dalla seriale
    switch (dato1)
    {
      case 'A': // Se ricevo la lettera A,        
          digitalWrite(ledPin1, LOW);
          Serial.print("1");
          break;
        
      case 'B':      
          digitalWrite(ledPin2, LOW);
          Serial.print("2");
          break;
        
      case 'C':        
          digitalWrite(ledPin3, LOW);
          Serial.print("3");
          break;
        
      case 'D':       
          digitalWrite(ledPin4, LOW);
          Serial.print("4");
          break;
          
      case 'S': // ricezione per scenario magico       
          Serial.println("OK");
          ciao = 1;
          break;        
    }
  }
  inputSize = 0;
  if (Serial.available() > 0 && ciao == 1)
  {
    delay(300);
   
    inputSize = Serial.available();
 
    Serial.println(inputSize);
    for (int i = 0; i < inputSize; i++)
    {
      myCmd[i] = Serial.read();
    }
  
    Serial.println(myCmd);         //// mi indica quando lettere e composta la frase
    Serial.println(myCmd[0]);
    Serial.println(myCmd[1]);
    Serial.println(myCmd[2]);
    Serial.println(myCmd[3]);
    Serial.println("visionedato");
    Serial.flush();
    ciao = 0;
  }
}

ma non va!!!

nid69ita:
Inoltre lo switch NON devi mettere le graffe per ogni case, altrimenti quel break non serve a nulla, esce dal blocco in cui è, non dal case

Questo non è vero ;). Le graffe servono solo a introdurre uno scope locale (ad esempio se vuoi dichiarare variabili visibili sono dentro un case, cosa che normalmente non puoi fare), ma break esce comunque dallo switch.

 inputSize = Serial.available();

    //Serial.print("inputSize=");
    Serial.println(inputSize);
    //Serial.print(Rele);
    for (int i = 0; i < inputSize; i++)
    {
      myCmd[i] = Serial.read();
    }

Per primo cosa Ti fa credere che proprio in quel momento arriva quel dato e non un altro numero spedito via seriale che era anora nel buffer?

Non so che valore Ti aspetti ma non é un numero che mandi ma il codice ashii della lettera che mandi.
Facilmente che vai fuori capienza del array di 50 elementi. Controlla almeno se il valore é minore uguale a 49.
Ciao Uwe

grazie mille per l'informazione esatta (SukkoPera).

uwefed
vuoi dire che vedo una lettera ma in realta e un numero ?

cioè se scrivo serial.write("A"); /// scrivo il numero 65??????

Allora ... calma e chiariamo ...
... COSA non fuziona del programma che hai messo al post #12 ?

Perché abbiamo cominciato dicendo che NON stampava con le Serial.write() ... e poi non ho più capito le discussioni che si sono sovrapposte ...

Guglielmo

P.S.: Se scrivi Serial.write('A') (... singoli apici) viene trasmesso il carattere 'A' che, in codice ASCII equivale al numero decimale 65 o esadecimale 0x41

P.S. sorry per il switch e graffe, ricordavo male.

Infatti secondo me manca una informazione, COSA spedisci ? Non lo hai mai detto

Se spedisci dei numeri, la print li manda come lettere “cifra per cifra”
mentre la write manda dei byte, se la cifra è <=255 manda esattamente un byte, come cifra.
Quindi è anche importante capire che dati spedisci

forse mi sono spiegato male:

vorrei creare una funzione con la lettera "S" che memorizza la stringa in ricezione e poi la spedisce singolarmente come se fosse digitato da tastiera.

Continui a dirci cosa vorresti fare, ma continui a NON dirci ESATTAMENTE che problema riscontri !!!

Guglielmo

P.S.: Per quello che vuoi fare, la cosa migliore è inviare un'unica stringa composta dal carattere iniziale 'S' e, immediatamente a seguire, i caratteri da stampare, CONCLUSI da un terminatore (es. CR = 0x0D) che è OBBLIGATORIO per capire quando è finita la stringa da ricevere !!!