Database comandi

Ciao a tutti,

Sono giunto a un punto morto con il mio progetto (immaginavo di arenarmi qui). Dalla seriale mi arrivano 3 byte che costituiscono il comando da eseguire sulla mia scheda Arduino UNO.

    if (Serial.available() == 3) {
      inByte[0] = Serial.read();
      inByte[1] = Serial.read();
      inByte[2] = Serial.read();
      while (Serial.available()) {
        int a;
        a = Serial.read();
      }
       timeOut = 0;
    }

Ora ho il comando nella'array inByte. E fino a qui tutto ok. Volevo creare una struttura che potesse in qualche modo rispondere al comando inviato (i 3 byte) dinamicamente. Cioè voglio creare una specie di "tabella" con relazione uno a molti.

Ricevo il comando "122" -> controlla nella struttura -> rispondo con "121" e "145". Mi piacerebbe che questa struttura fosse "salvata" su una SD. In modo da poterla leggere in futuro con la shield Ethernet.

Avete qualche idea?

Non è molto chiaro questa struttura una-molti. C'e' un limite ? Sempre 2 di risposta a 1 comando ? Spiega meglio :)

Ciao nid69ita,

Il comando è sempre e solo uno composto da 3 byte di dati. Le risposte teoricamente infinite, ma praticamente credo di non superare la soglia di 32.

Es:

Comando -> 122 Risposta -> 121 145 148 16 123 178 185.

Innanzitutto vorrei capire se questi 3 byte arrivano da qualcosa che è già fatto e intoccabile, perché se invece potessi cambiare il protocollo di comunicazione, per mandare valori come quelli che sembra ti servano basta un byte, visto che può assumere valori da 0 a 255.

In ogni caso, non è chiaro cosa stabilisce quante e quali saranno le risposte ai vari comandi. Se c'è una logica (tipo: "prima cifra = 1 -> faccio X, seconda cifra = 5 -> faccio anche Y, ecc...), allora puoi banalmente implementare quella. Se invece la mappatura è praticamente casuale, allora potresti forse trasformare in intero il comando che ricevi e farci sopra uno switch(), nei cui case andrai a gestire puntualmente ogni comando che ti interessa.

La logica è la seguente:

"123"

  • Indirizzo scheda da cui arriva il comando
  • Porta della scheda da cui arriva il comando
  • Valore della porta.

In base a questi dati decido che comandi inviare. Il protocollo non vorrei cambiarlo anche perché lo sto testando con successo con valori fissi su una linea RS485 a 1Mbaud/s.

Mi manca proprio la struttura, la logica per cui in base alla sequenza dei 3 Byte riesco a fare un "while" dei comandi da inviare. In pratica parlando in SQL ci vorrebbe un SELCT su una struttura dove la chiave primaria è il comando ricevuto. La risposta della query sono un'array di comandi sempre a 3 Byte.

Puoi mettere questa tabella, stile db, tanto per capirla ? I dati potrebbero stare in una matrice (array a più dimensioni) caricandola da un file su SD in fase di setup() Sempre non siano troppi dati per la memoria di Arduino Uno. Solo 2K di SRAM. Eventualmente potrebbe stare in EEPROM se la tabella è fissa.

Conosci lo switch() di cui parlavo sopra? Mi sembra faccia al caso tuo:

switch (cmd) {
  case 123:
    controlla ();
    invia ();
    break;
  case 257:
    invia ();
    break;
  case 199:
    foo ();
    bar ();
    antani ();
    break;
}

nid69ita: Puoi mettere questa tabella, stile db, tanto per capirla ? I dati potrebbero stare in una matrice (array a più dimensioni) caricandola da un file su SD in fase di setup() Sempre non siano troppi dati per la memoria di Arduino Uno. Solo 2K di SRAM. Eventualmente potrebbe stare in EEPROM se la tabella è fissa.

Il problema è proprio capire come creare la struttura della "tabella". Avevo pensato anch'io agli array multidimensionali caricati sa una SD. Ma come li creo?

Come scorro all'interno dell'array?

Array = [byte1][byte2][byte] e i comandi?

SukkoPera: Conosci lo switch() di cui parlavo sopra? Mi sembra faccia al caso tuo:

switch (cmd) {
  case 123:
    controlla ();
    invia ();
    break;
  case 257:
    invia ();
    break;
  case 199:
    foo ();
    bar ();
    antani ();
    break;
}

SukkoPera, avevo letto sopra, infatti per le prove di pochi comandi sto gia utilizzando il classico switch che è la morte sua. Ma se devo farlo per 20 schede con 6 porte sono a 120 case. E per ogni case ho tre risposte 120 x 3... paura.

http://www.tutorialspoint.com/cprogramming/c_multi_dimensional_arrays.htm

arr[a][b][c]=valore;   //scrivi elemento
valore=arr[a][b][c];   //leggi elemento

Ma il problema è... Arduino Uno ha poca memoria, 2K

Sempre che Arduino lo permetta (non l'ho mai provato) io la vedo così:

array a 3 dimensioni dove la dimensione 1 contiene gli indirizzi delle schede, la 2 gli indirizzi delle porte e la 3 gli stati delle porte e quindi i comandi. Mi spiego meglio:

a) ricevo il comando 135

b) prendo l'elemento 1,3,5 dell'array, ovvero 1° elemento della dimensione 1, 3° elemento della dimensione 2 e 5° della dimensione 3

c) leggo i comandi contenuti nel 5° elemento della dimensione 3

I comandi potrebbero essere formati da una stringa di caratteri numerici da suddividere dopo la lettura, per esempio, in gruppi di 3 per separare i singoli comandi. Avremo quindi ad esempio la stringa "132098746294000000" che potrebbe generare i 6 comandi singoli "132", "098", "746", "294", "000", "000".

Ovviamente "000" = nessun comando :grinning:

Ciao

Attilio