Domanda sul codice

Salve.

Sto cercando di realizzare una battaglia navale con una matrice led di 34 per 34. Non ho problemi nella gestione della matrice, ma nel riconoscimento delle coordinate inviate ad Arduino...
Sul monitor seriale ricevo dei dati tipo 24 - 27 dove 24 rappresenta la coordinata del led sull'asse x e 27 rappresenta la coordinata del led sull'asse y. Il problema è che non so come distinguere un dato dall'altro (24 da 27). Grazie mille a chi vorrà aiutarmi!

Ma il protocollo di trasmissione lo decidi tu?
Nel caso, la cosa più semplice è spedire 2 byte, il primo indica la coordinata X ed il secondo la coordinata Y. Così non hai da fare neanche le conversioni.

Per la trasmissione uso un protocollo seriale. Penso sia la cosa più semplice.

Già, hai ragione....Posso spedire sue byte distinti :* Non ci avevo pensato!

in ogni caso...

char inp[] = "24 - 27";
int x, y;

sscanf(inp, "%d - %d", &x, &y);

/* adesso x vale 24 e y vale 27 */

Ciao

Hai trasmesso 7 byte (anzi 8 con il carattere "\0" di fine char).

Se fai:

Serial.print(24, BYTE);
Serial.print(27, BYTE);

hai le stesse coordinate ed hai trasmesso solo 2 byte.

MGuruDC:
in ogni caso...

char inp[] = "24 - 27";

int x, y;

sscanf(inp, "%d - %d", &x, &y);

/* adesso x vale 24 e y vale 27 */



Ciao

non solo hai trasmesso più byte del necessario (che fondamentalmente in un'applicazione del genere chissene), ma sei incappato in una bastardata della seriale.

se a priori hai estrapolato il buffer della seriale andando a caccia di "\0", ed elaborando pezzo per pezzo, ok, funziona, altrimenti rischi:

  1. che per ora sia giunta solo parte dell'input via seriale, quindi x e y prendono valori più o meno casuali, sempre che non si impalli la sscanf
  2. che hai più coordinate in inp: in questo caso credo che estrapoli solo la prima occorrenza

il codice di leo invece sfrutta una delle "debolezze" della seriale, ovvero di poter leggere (in modo bloccante) solo un byte alla volta, per superare questi problemi che richiederebbero una stesura di codice "inutile", oltre che a risparmiare qualche byte di banda.

Certo che siete veramente bravi a complicare una cosa semplice :slight_smile:
Basta spedire tre byte consecutivi, il primo contiene un valore/carattere che è diverso dal range dei dati, in questo caso da 1 a 34, p.e. utilizziamo 0xff (255), a seguire i due byte dei valori.
Chi riceve non deve fare altro che ascoltare in attesa di 0xff, tutto quello che arriva prima di questo valore è da ignorare.
Non appena si riceve 0xff si acquisiscono i due byte seguenti che sono i nostri valori e il ciclo riparte, si può anche prevedere un eventuale time out per la ricezione dei due byte dati.
Protocollo semplicissimo, leggero, facile da gestire, affidabile quanto basta.

E io che ho detto? Spedire 2 byte, poi il protocollo uno se lo implementa come vuole, con byte di inizio e fine trasmissione ecc.. :wink:

leo72:
E io che ho detto? Spedire 2 byte, poi il protocollo uno se lo implementa come vuole, con byte di inizio e fine trasmissione ecc.. :wink:

L'hai detto con meno eleganza :wink: :wink: :wink:
Ciao Uwe

uwefed:
L’hai detto con meno eleganza :wink: :wink: :wink:
Ciao Uwe

Ah, beh… se è per questo… :sweat_smile:

MGuruDC:
in ogni caso...

char inp[] = "24 - 27";

int x, y;

sscanf(inp, "%d - %d", &x, &y);

/* adesso x vale 24 e y vale 27 */



Ciao

Dovrei chiarire quel "in ogni caso..." la sopra con un "se ti capitasse qualche altra volta di dover estrarre valori numerici da una stringa composta, (anche se in questo caso il problema si risolve per tutt'altra via), si fa così...".
Ciao