Vorrei leggere dalla porta seriale una stringa di lunghezza indefinita, ma con un carattere di inizio e uno di fine.
Avevo pensato ad un ciclo while che aspettasse il carattere di fine stringa però c'è un problema. Se per un motivo qualsiasi la trasmissione si interrompe, il ciclo while diventerebbe infinito.
devi introdurre un timeout... Prima di far partire il ciclo di lettura che si interrompe con la lettura del carattere di fine stringa, memorizzati il valore di millis. Nel ciclo leggi il valore corrente di millis ed esci dal while se il valore corrente meno quello iniziale è maggiore di un certo timeout che hai impostato.
In pratica se prevedi che la stringa più lunga impieghi massimo 100ms per arrivare esci dal while con il carattere di fine stringa oppure se il ciclo dura più di 100 ms.
Ho trovato questo esempio su internet, intendi una cosa come questa?
// read into buffer until terminator received
// timeout if not received within timeout_period mS
// returns true if received within timeout period
// returns false if not received, or no terminator received but buffer full
bool readStringUntil (char * data,
const unsigned int length,
const unsigned long timeout_period,
const char terminator)
{
unsigned int index = 0;
unsigned long start_time = millis ();
while (index < length)
{
// check if time is up
if (millis () - start_time >= timeout_period)
return false; // no data in timeout period
// if data, add to buffer
if (Serial.available () > 0)
{
char r = Serial.read();
if (r == terminator)
{
data [index] = 0; // terminating null byte
return true;
} // end if terminator reached
data [index++] = r;
} // end if available
} // end while loop
return false; // filled up without terminator
} // end of readStringUntil
vi chiedo un consiglio, ho un programma dove tramite laview invio dei dati ad arduino. Al momento riesco ad inviare un dato numero e lui esegue tutto. Ora vorrei inviarli due dati tipo (x,n) come si puo fare?. Ho arduino uno R3 e comunico tramite seriale usb.
se serve allego il programma
Secondo me era anche meglio se creavi un tuo thread e non ti agganciavi a questo.
Comunque, meglio se posti il codice. Come leggi da Arduino ? Serial.parseInt() o serie di Serial.read() ?
Come è fatto di preciso i dati che spedirai da LabView ? 2 cifre separate da virgola e basta ?
Ciao ora c'è un solo un dato e dovrei inviare due separati dalla virgola #include <Stepper.h>
const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution
// for your motor
// initialize the stepper library on the motor shield
Stepper myStepper(stepsPerRevolution, 12,13);
// give the motor control pins names:
const int pwmA = 3;
const int pwmB = 11;
const int brakeA = 9;
const int brakeB = 8;
const int dirA = 12;
const int dirB = 13;
// n is the number of stps to move
int n = 0;
void setup() {
// set the PWM and brake pins so that the direction pins
// can be used to control the motor:
pinMode(pwmA, OUTPUT);
pinMode(pwmB, OUTPUT);
pinMode(brakeA, OUTPUT);
pinMode(brakeB, OUTPUT);
digitalWrite(pwmA, HIGH);
digitalWrite(pwmB, HIGH);
digitalWrite(brakeA, LOW);
digitalWrite(brakeB, LOW);
// initialize the serial port:
Serial.begin(9600);
// set the motor speed in revolutions per minute.
myStepper.setSpeed(10);
}
void loop(){
if (Serial.available()>0){
n = Serial.parseInt();
}
if( n != 0){
myStepper.step(n);
}
n =0;
}
Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.
Se usi la parseInt, dovrebbe bastare leggere 2 volte:
if (Serial.available()>0)
{ n1 = Serial.parseInt();
n2 = Serial.parseInt();
}
In quanto la parseint dovrebbe scartare la virgola, come in questo esempio:
Altrimenti bisogna non usare la parseint ma leggere il dato un carattere alla volta. Tieni conto che quando spedisci 123,456 in realtà stai spedendo ben 7 caratteri; '1' poi '2' etc ed analizzare quella stringa non è semplicissimo per chi è alle prime armi. Una delle difficoltà ad esempio è che le cifre non sono a lunghezza fissa.