Salve, mi scuso già ora se la domanda sembrerà banale ma non riesco ad uscirne.
Dunque ho un Arduino Uno collegato ad un potenziometro, lo sketch caricato e' quello di esempio del Analogic In. A questo ho aggiuto Serial.begin(9600); e Serial.println(sensorValue);. Con un programmino in C# leggo i valori da 0 a 1023 senza problemi e li stampo in una textbox. Mi e' venuta l'idea di creare un altra textbox e stamparci la percentuale corrispondente al valore ottenuta tramite una semplice proporzione. Per fare la divisione e la moltiplicazione ho dovuto convertire la string che arriva dalla serialPort1 in una double tramite double.Parse(RxString); o Convert.ToDouble(RxString);. Qui sorge il problema: le stringhe originali stampate cosi' come vengono ricevute sono perfette, quelle che passano dentro Convert.ToDouble(StringaCheVoglioConvertire); restituiscono l'errore (apparentemente in maniera random) "Formato della stringa di input non corretto". Ho capito che questo errore e' causato da un valore Null inviato da Arduino. Ma come e' possibile? E' la stessa identica stringa che viene stampata correttamente ed e' sempre diversa da Null. :~
Ho notato che aumentando il BaudRate da 9600 a 19200 l'errore compare moooolto di meno.
PS: ovviamente nella stampa il risultato ti risulta corretto perchè il programma lancia l'eccezione subito dopo il fallito tentativo di convertire il dato e quindi si blocca.
Ciao ypkdani, grazie della risp.
Sembra entrare nel il if ogni ciclo...
private void DisplayText(object sender, EventArgs e)
{
textBox1.AppendText(RxString);
if (!string.IsNullOrEmpty(RxString2))
{
textBox2.AppendText(RxString2);
}
else
{
a = double.Parse(RxString2);
a = a / 3; //operazione a caso
b = Convert.ToString(a);
textBox2.AppendText(b);
}
}
cosi' dovrebbe eseguire l'else se e solo se la stringa non e' Null.
Con il codice che ti ho postato entri nell'if solo se la stringa non è null o vuota quindi contiene qualche cosa (ATTENZIONE alla negazione che ho messo "!"), nel tuo caso si presenta comunque l'errore perchè entri nell'else se la stringa contiene un null o è vuota e provi a convertire.
Vedi qui: String.IsNullOrEmpty(String) Metodo (System) | Microsoft Learn
private void DisplayText(object sender, EventArgs e)
{
textBox1.AppendText(RxString);
if (!string.IsNullOrEmpty(RxString2))
{
a = double.Parse(RxString2);
a = a / 3; // operazione a caso
b = Convert.ToString(a);
textBox2.AppendText(b);
}
else
{
a = z;
}
Come hai detto tu entra nel if correttamente ma dopo qualche ciclo mi da lo stesso errore...
Ora comincio a pensare che non sia dovuto a un Null :S
ovviamente prima di convertire il dato in numero devi essere sicuro di aver estratto dalla stringa in arrivo solo la parte contenente il numero ed eliminare eventuali caratteri non corretti come il newline "\n" .....
Ah e c'e qualche metodo particolare per fare ciò?...sai ho iniziato da poco con Arduino e ho soltanto qualche fondamento di C.
Grazie della tua disponibilità
void loop() {
// read the value from the sensor:
sensorValue = analogRead(sensorPin);
// turn the ledPin on
digitalWrite(ledPin, HIGH);
// stop the program for <sensorValue> milliseconds:
delay(sensorValue);
// turn the ledPin off:
digitalWrite(ledPin, LOW);
// stop the program for for <sensorValue> milliseconds:
Serial.println(sensorValue); // <- qui invio il valore
delay(sensorValue);
}
e rivevo una stringa con un numero da 0 a 1023
EDIT: ora che mi ci fai pensare nella textbox del valore convertito vengono stampati tutti i numeri in fila e non in colonna ( quei pochi che stampa prima di darmi l'errore)
magari il \n e' responsabile.
Anispir:
EDIT: ora che mi ci fai pensare nella textbox del valore convertito vengono stampati tutti i numeri in fila e non in colonna ( quei pochi che stampa prima di darmi l'errore)
magari il \n e' responsabile.
Serial.println stampa ogni valore seguito dai caratteri \r e \n (ASCII 13 e ASCII 10).