arduino con il pc stringa dati troppo lunga

come faccio a regolare il flusso tra arduino e il pc…
fate conto che devo mandare 9 dati via seriale da arduino al pc…7 digitali e 2 analogici…come faccio a dire ad arduino di aspettare una “via libera” per mandare solo un ciclo di dati alla volta?

Ti devi creare un handshake:

Es: arduino manda un codice al PC (tipo "@") e attende la risposta del pc che magari potrà essere "$". Quindi Arduino spedisce il pacchetto dati e conclude ancora con "@" .. e così via!

In questo modo ottieni quello che cerchi ;)

P.S. è chiaro che i codici di richiesta trasmissione ("@" nell'esempio) e conferma trasmissione ("$" nell'esempio) dovranno essere valori che non fanno parte dell trasmissione ::)

che istruzione uso??? serial.available?

edit. io avevo provato una cosa del genere...sul programma sul pc(fatto in wpf) avevo messo un write sulla porta e sull'arduino un if che non inviava i dati se non leggeva con un read il valore però così non mi funzionava e non ricevevo nessun dato nel pc

Se vuoi un esempio concreto di come fare guarda "SerialCallResponse" presente in Arduino/File/Examples/Communication

4 cose

  1. mi conviene continuare “a mano” o è meglio se guardo una libreria?

  2. sul programma del pc devo mandare un carattere per far avviare la “conversazione”

3)non metto in dubbio che l’esempio funziona ma mi spiegheresti questo passaggio

while (Serial.available() <= 0) 
{   
 Serial.print('A', BYTE);   // send a capital A
}

praticamente dice se non ci sono byte disponibili per scrivere manda una A…non dovrebbe esse il contrario(se ci sono byte disponibili manda la A)

  1. un Serial.Flush prima di inviare i dati ogni volta ci sta o potrei fare un casino???

ps. per fortuna che ci sei tu se no questo stage sarebbe andato parecchio peggio ;D

1) Cosa vuol dire continuare "a mano"? Se hai ben compreso il concetto puoi "lanciarti" e scrivere il codice. E' sempre meglio lavorare sul proprio codice che su quello degli altri, ricordatelo sempre!

2) non è quello che fa l'esempio che ti ho indicato?

3) In realtà quello spezzone di codice "dice": Visto che non ci sono altri caratteri disponibili (e quindi il computer è in attesa) invio al computer una "A"

Un piccolo consiglio: quando ragioni di come funziona un programma cerca di immedesimarti nella parte che stai programmando, come ho scritto io nell'esempio qui sopra. Vedrai che così riesci a capire meglio le logiche, i tempi e i flussi di dati.

4) Usare Serial.Flush comporta lo svuotamento del buffer della seriale, e quindi vuol dire poter perdere dei dati. E' una cosa che si fa solo quando c'è stato un problema irrecuperabile e si vuole resettare la comunicazione (o si inizia una nuova comunicazione e quindi si vuole la certezza nn siano presenti dati di vecchie trasmissioni). Il buffer lo devi svuotare leggendolo e trattando i vari caratteri ricevuti.

ok ci dovrei essere riuscito…ora però ho il problema dei valori sballati ;D…per ora provo a risolvere da solo semmai poi posto

bo praticamente la stringa che mi arriva è "AAAAAAA\r\n0\r\n1\r\n..." ecc o una cosa del genere...il problema è che i valori sono fissi e non cambiano anche se do gli ingressi a 1(teoricamente dovrebbero essere tutti a zero invece alcuni sono a 1 e gli analagici sono sempre sui 520 più o meno)

sicuramente ho sbagliato qualcosa sul programma arduino

edit. c'è un modo per mettere in imput i pin 0 e 1 e abbassarli a 0 invece di 5 volt?

edit2. non so perchè se stacco e riattacco la usb la stringa non me la riprende più e devo rimettere il programma...sto arduino lo sto capendo sempre meno

posta il codice

int inByte;
int presenza_persone = 0;
int presenza_veicolo_sx = 0;

int presenza_persone_pin = 2;
int presenza_veicolo_pin = 6;
void setup()
{
  pinMode(presenza_persone_pin, INPUT);
  pinMode(presenza_veicolo_pin, INPUT);
  Serial.begin(9600); 
}
void loop()
{
  presenza_persone = digitalRead(presenza_persone);
  presenza_veicolo_sx = digitalRead(presenza_veicolo_pin);
  establishContact();
   if (Serial.available() > 0)
  {
    inByte = Serial.read();
    Serial.println(presenza_persone);
    Serial.println(presenza_veicolo_sx);  
  }
  delay(1000);
}

void establishContact() 
{
  while (Serial.available() <= 0) 
  {
    Serial.print('A', BYTE);   // send a capital A
    delay(300);
  }
}

ho ricominciato da capo passo passo…appena metto più di un digital read va tutto sbagliato

fare un " if"

void setup()   {
  // initialize the digital pin as an output:

  Serial.begin(9600);      // opens serial port, sets data rate to 9600 bps
}


// the loop() method runs over and over again,
// as long as the Arduino has power

void loop()
{
  // send data only when you receive data:
        if (Serial.available() > 0) {
              // read the incoming byte:
              Chart PC = Serial.read();
}
if (PC == “A”) {
  
Serial.Println ( dato1, Dec);
             Serial.Print ( dato2, Dec);
??..
}      

}

stavo postando il codice mentre lo postavi tu ... Scusate.... ma perchè devo "printare" dei falsi dati .. li printo quando il pc li chiede .. no?

in che senso falsi dati?

il famoso "a" ... se tu mandi da pc . con un qualsiasi serial monitor un comando .. a quel punto e solo a qul punto .. dici ad arduino di mandarti i dati ..

io non lo so...ho visto l'esempio del SerialCallResponse

comunque nel programma del pc mando una lettera così da far partire la comunicazione...

si ma il problema non è la comunicazione perchè comunque pare che mi manda la giusta quantità di dati... è la qualità che lascia parecchio a desiderare

ho testato che se do io il valore (sull'inizializzazione delle variabili) la comunicazione è perfetta ma appena metto i digital read va come vuole

posta l'output che ricevi

Il mio consiglio era di scrivere un TUO codice e non di “adattare” l’esempio…

Prova a vedere se questo funziona:

int inByte;
int presenza_persone = 0;
int presenza_veicolo_sx = 0;

int presenza_persone_pin = 2;
int presenza_veicolo_pin = 6;
void setup()
{
  pinMode(presenza_persone_pin, INPUT);
  pinMode(presenza_veicolo_pin, INPUT);
  Serial.begin(9600);
}
void loop()
{
  presenza_persone = digitalRead(presenza_persone);
  presenza_veicolo_sx = digitalRead(presenza_veicolo_pin);
  establishContact();
  Serial.println(presenza_persone);
  Serial.println(presenza_veicolo_sx);
  delay(1000);
}

void establishContact()
{
  char risposta;
  Serial.print('A', BYTE);   // invia richiesta di trasmissione
  while (Serial.available() <= 0 && risposta != "B") //aspetta sino a quando non riceve l'ok con il codice "B"
  {
    risposta = Serial.read();
  }
}

Spiegazione:

  • Quando chiami la funz establishContact() questa invia un carattere (A) come richiesta di invio dati
  • il PC quando è pronto a ricevere legge il suo buffer della seriale dove trova “A”, così risponde con “B”
  • Ad Arduino arriva la “B” così esce dall’attesa ed invia il pacchetto dei dati.
  • Quindi la cosa ri ripete… :wink:

"0\r\n0\r\n0\r\n0\r\n0\r\n0\r\n0\r\n0.00\r\n0.00\r\n" se metto io i valori a zero se metto dei digital read alcune volte(dopo aver staccato il segnale ) trovo degli 1 che non centrano niente

edit. anche se non metto per niente il segnale trovo 1 che non centrano...un vaore è sbagliato anche se non ha il digital read

ripeto che senza digital read e mandando solo i dati in seriale la cosa va a buon fine

Controlla i riferimenti a massa (GND) tra i due dispositivi…

P.S: hai provato anche il mio codice?