Salve a tutti!
Mi sono da poco avvicinato ad Arduino ( o meglio, è da qualche anno, ma sempre per progetti molto semplici) e, pur avendo una preparazione nel campo della programmazione non proprio solidissima , grazie ai contributi del forum, sono sempre riuscito a superare i piccoli problemi incontrati.
Ora però mi trovo in una situazione inaspettata che coinvolge non funzioni esotiche ( o esoteriche) ma la funzione più banale, la cara Serial.print().
Arrivando alla questione, sto cercando di inviare uno stream di dati da un micro (ho provato con Arduino UNO , Mini e STM32) a un PC (Win10): il mio sketch legge -al momento- un ingresso analogico e il millis() e invia un pacchetto dati del tipo:
[aaa,bbb,ccc,ddd,eee,fff,ggg,hhh][aaa,bbb,ccc,ddd,eee,fff,ggg,hhh]....
ovvero 8 valori separati da una virgola e racchiusi tra parentesi quadre.
In particolare :
aaa= valore dell'ingresso analogico A0
bbb= valore di millis()
ccc= valore "0"
ddd,eee,fff= i valori inviati nella lettura precedente (a scopo debug)
ggg=ancora il millis() precedente
iii= variabile da usare per test.
Ecco il codice:
#define SERIAL_SPEED 115200
const int y_Pin = A0;
int test = 0;
struct
{
unsigned long time_x;
uint16_t y_value;
uint16_t tr_value;
unsigned long time_x_old;
uint16_t y_value_old;
uint16_t tr_value_old;
} csv_array;
uint16_t y_value_temp;
uint16_t tr_value_temp;
uint16_t y_value_arch;
uint16_t tr_value_arch;
unsigned long time_x_arch;
bool start = true;
void setup()
{
Serial.begin(SERIAL_SPEED);
csv_array.time_x = millis();
Serial.flush();
}
void loop()
{
for (;;)
{
y_value_temp = analogRead(y_Pin);
tr_value_temp = analogRead(trav_pin);
csv_array.time_x_old = csv_array.time_x;
csv_array.y_value_old = csv_array.y_value;
csv_array.tr_value_old = csv_array.tr_value;
csv_array.y_value = map(y_value_temp, 0, 1023, 0, 1023);
csv_array.tr_value = map(tr_value_temp, 0, 1023, 0, 1023);
csv_array.time_x = millis();
if (start == false)
{
if (y_value_arch != csv_array.y_value_old)
{
test = 1;
}
if (tr_value_arch != csv_array.tr_value_old)
{
test = 1;
}
if (time_x_arch != csv_array.time_x_old)
{
test = 1;
}
if (csv_array.time_x_old > csv_array.time_x)
{
test = 1;
}
}
start = false;
Serial.print("[");
Serial.print(csv_array.y_value);
Serial.print(",");
Serial.print(csv_array.time_x);
Serial.print(",");
Serial.print(csv_array.tr_value);
Serial.print(",");
Serial.print(csv_array.y_value_old);
Serial.print(",");
Serial.print(csv_array.time_x_old);
Serial.print(",");
Serial.print(csv_array.tr_value_old);
Serial.print(",");
Serial.print(time_x_arch);
Serial.print(",");
Serial.print(test);
Serial.print("]");
Serial.flush();
y_value_arch = csv_array.y_value;
tr_value_arch = csv_array.tr_value;
time_x_arch = csv_array.time_x;
}
}
Ora la cosa sembra ( ....e probabilmente lo è) elementare, una volta inizializzata la seriale inizio con una serie di Serial.print() ad inviare i dati al PC.
La cosa sembra funzionare bene per un po', poi ho dei valori strani
Avevo inizialmente inviato questa richiesta al forum di QT, proprio perchè pensavo che questi problemi potessero essere legati al lato PC e ritenevo -a torto- che il problema non potesse essere sul lato micro.
Ora vediamo cosa intendo per "strani" (sono andato a capo per questioni di leggibilità):
...
[290,862252,0,290,862249,0,862249,0]
[290,862254,0,290,862252,0,862252,0]
[290,862256,0,290,862254,0,862254,0]
[290,862258,0,290,862256,0,86226,0,866206,0] <-----
[368,866211,0,368,866208,0,866208,0]
[368,866213,0,368,866211,0,866211,0]
[370,866215,0,368,866213,0,866213,0]
[370,866217,0,370,866215,0,866215,0]
....
[372,866571,0,372,866569,0,866569,0]
[372,866573,0,372,866571,0,866571,0]
[372,866575,0,372,866573,0,866573,0]
[372,866577,0,372,8665723,0] <------
[308,862627,0,309,862625,0,862625,0]
[309,862629,0,308,862627,0,862627,0]
...
Da notare che il tempo prima "salta" avanti di circa 4sec e poi torna indietro di circa 4sec.
I valori di controllo (4°,5° e 6° valore) sembrano conservati come se non fosse un errore di trasmissione ma, piuttosto , come se fosse stato sovrascitta la parte evidenziata tra le due frecce e, in effetti, i due valori di tempo "esterni" all'errore (862258 e 862627) coprono circa lo stesso intervallo di quello "interni" ( 866211 e 866577).
La mia impressione è che ci sia una sorta di buffer "circolare" che ad un certo punto vada in overflow e inizi a sovrascrivere dei valori precedentemente archiviati, ma non capisco il perchè...
Il valore finale della terz'ultima riga "8665723" potrebbe essere il 866575 con il 5 troncato- quindi (86657) - che ha sovrascritto un 862623 (valore plausibile per la riga precedente) ->(86657)(23).
La parte finale del file (interrotta perchè ho interrotto il test...) , è:
[368,866017,0,368,866015,0,866015,0]
[368,866019,0,368,866017,0,866017,0]
[368,866021
e potrebbe essere sensato come ordine di grandezza.
Qualcuno ha qualche consiglio? Il problema non sembra influenzato dalla velocità di trasmissione,
Grazie 1000 e scusate per il post lungo come Guerra e Pace!