Aiuto con charArray


buongiorno tutti.
ho realizzato uno sketch che gira perfettamente su arduino uno e che sfrutta un hmi nextion ed una libreria non originale per il suo controllo (libreria nextion - uso questa perchè è più semplice per quel che devo fare).

il problema è che, come dice l'ide:

code: [select]

lo sketch usa 25.650 byte (79%) dello spazio disponibile per programmi. il massimo è 32.256 byte.
le variabili globali usano 1.340 byte (65%) di memoria dinamica, lasciando altri 708 byte liberi per le variabili locali. il massimo è 2.048 byte.


poichè l'hmi ha un controllo stringhe, vorrei evitare di incappare in blocchi o frammentazioni della ram che portino blocchi del sistema nel lungo periodo.

attualmente le stringhe fisse le ho spostate in flash con la funzione f(), ma vorrei impiegare il più possibile le chararray solo che mi trovo bloccato quando devo estrapolare alcuni valori dalle stringhe in arrivo.

esempio:

code: [select]
  //----- inserimento dati rtc -----
  if (message.substring(0, 4) == f("70 h"))
  {
    ore = (message.substring(4, 6)).toint();
    minuti = (message.substring(6, 8)).toint();
    giorno = (message.substring(9, 10)).toint();

    settime(ore, minuti, secondi, giornosync, 4, 2015);
    rtc.set(now());
  }


in questo caso quando ricevo una stringa che inizia con 70 h devo poter estrapolare valori di ore, minuti e giorno dalla stringa stessa (la stringa intera è: 70 h235905 dove 23 sono le ore, 59 sono minuti e 05 è il giorno della settimana).

come faccio ad estrapolare due valori consecutivi dall'array anzichè solo quello dell'index tra parentesi quadre?

per le stringhe classiche del c, ovvero array/vettori di char, usa le funzioni strxxx() della libreria standard.
per il confronto ad esempio usa strcmp()    string compare. ancora meglio strncmp() dove dici quanti caratteri confrontare.
per copiare da array ad array, strcpy(),   la lunghezza di una stringa  strlen()
poi essendo questo tipo di stringhe degli array, puoi accedere ad un elemento alla volta con le quadre.
per la conversione, invece di usare funzioni tipo atoi() che richiedono il vettore finisca con null (ovvero '\0' ovvero 0)    puoi fare tu il calcolo leggendo semplicemente due char di ogni numero e numeri come ascii sono dal valore '0'=48 al '9'=57  quindi togli 48 ed hai il valore della singola cifra.
code: [select]
char buf[21];
message.tochararray(buf,20);
if(strncmp(buf,"70 h",4)==0)    // if (message.substring(0, 4) == f("70 h"))
{ // esempio: "70 h235905"
  //  indice:  0123456789
  ore=(buf[4]-48)*10+buf[5]-48;    // '2' ovvero ascii 50-48=2   2*10+'3'-48
}




Arduino Forum > International > Italiano > Software (Moderator: leo72) > Aiuto con charArray


arduino

Comments

Popular posts from this blog

Error: ‘for’ loop initial declarations are only allowed in C99 or C11 mode - Raspberry Pi Forums

class MPU6050 has no member named begin

missing filename after '-o'