Come sezionare una variabile

salve a tutti.
come e possibile sezionare in 2, una variabile:
mi spiego: ho una variabile "x" che contiene "ciao a tutti 123ab". e una variabile "y" che vada a prendere dalla variabile "x" contado 13 caratteri, vada a prelevare 5 caratteri cosi avendo "123ab" nella variabile "x"

grazie per gli eventuali suggerimenti. :slight_smile:

Usa le funzioni definite dentro string.h ... QUI un reference :wink:

Guglielmo

ci sarebbe per il C di arduino???

Veramente string.h è normalmente incluso da Arduino ...
... hai provato ad usare le funzioni (es. strcpy ... che è quella che serve a te) ?

Guglielmo

a ok grazie (non pensavo che era già inclusa)
comunque non capisco come utilizzare la funzione strcpy
se hai tempo mi potresti gentilmente dare una mano.
grazie 1000

Immaginando di avere la tua stringa "ciao a tutti 123ab" (... che è NULL terminated) e di voler mettere gli ultimi 5 caratteri in un'altra stringa, alla strcpy dovrai passare il il puntatore della destinazione ed il puntatore dell'origine e ... la funziona copia nella destinazione da dove gli hai passato come origine fino al terminatore incluso.

Qualche cosa tipo ...

char * origine = "ciao a tutti 123ab";
char destinazione[6];

strcpy(destinazione, &origine[12]);

... così parte dal 13 carattere di origine (gli stai dando tu l'indirizzo) e copia da li fino al terminatore in destinazione :wink:

Occhio alle dimensioni degli array che se "sfori" ... sovrascrivi il codice e perdi il controllo del programma !!! Al limite usa strncpy che vuole anche quale è il massimo di caratteri da copiare.

Guglielmo

Grazie mille Guglielmo mi sei stato molto utile
grazie :slight_smile:

Perche se faccio cosi non funziona?

void setup() {
 int origine;  
 int destinazione;
Serial.begin(9600);
  origine = 'ciao a tutti 123ab';
}
void loop() {

 char * origine ;
 char destinazione[6];

 strcpy(destinazione, &origine[12]);
 
 Serial.println(destinazione);
  
}

danyevo:
Perche se faccio cosi non funziona?
...

Perché, emmm ... mi sembra, ti manchino proprio i concetti di base del C ...
... tipi di variabili, variabili "locali", variabili "globali", campo di visibilità di una variabile, ecc. ecc. !!! :roll_eyes:

Nel setup() hai dichiarato una variabile di nome origine, di tipo int, quindi di 2 bytes, visibile solo dentro setup() e con quell' assegnazione che hai fatto (singoli apici) ci hai messo dentro ... 'ab' ovvero i primi due bytes (da destra) di quella sequenza di bytes che gli hai racchiuso tra singoli apici.

Nel loop() hai definito una variabile di nome origine, di tipo char *, quindi un puntatore ad una stringa di caratteri, visibile solo dentro loop() e non c'hai messo dentro nulla ...

... come pretendi che funzioni ??? ]:smiley:

Se fossi in te ... mi prenderei un bel manuale del C e mi meterei a studiarlo seriamente ... :wink:

Guglielmo

Scusami il mio intento era capire come dopo aver ricevuto una variabile dalla porta seriale come fare per inserirla in origine.

danyevo:
Scusami il mio intento era capire come dopo aver ricevuto una variabile dalla porta seriale come fare per inserirla in origine.

Si, ma capisci che senza solide BASI ... tutto diventa molto più difficile e complesso ... :wink:

Comunque, da una porta seriale, NON ricevi una variabile, ricevi (o trasmetti) UN carattere (... ed uno solo per volta) ... poi come mettere assieme più caratteri è un'altro discorso ... :roll_eyes:

Guglielmo

Appunto come faccio a ricevere piu caratteri insieme?

Primo, devi decidere un carattere terminatore che ti indichi quando è finita la stringa che stai ricevendo, ad esempio, appunto per le stringhe, spesso di usa il CR (0x0D) o il LF (0x0A) ... ma puoi decidere tu un qualsiasi carattere terminatore, poi ...

... devi fare un ciclo che legge carattere a carattere, memorizza in un array, fino a quando non riceve il terminatore, che indica la fine della stringa.

A quel punto hai i tuoi caratteri in un array e ci fai quello che vuoi ...

Se ne è parlato infinite volte qui sul forum ... e ci sono sicuramente degli esempi fatti in tanti post ... fai un po' di ricerche ... :wink:

Guglielmo

gpb01:
Primo, devi decidere un carattere terminatore che ti indichi quando è finita la stringa che stai ricevendo, ad esempio, appunto per le stringhe, spesso di usa il CR (0x0D) o il LF (0x0A) ... ma puoi decidere tu un qualsiasi carattere terminatore, poi ...

... devi fare un ciclo che legge carattere a carattere, memorizza in un array, fino a quando non riceve il terminatore, che indica la fine della stringa.

A quel punto hai i tuoi caratteri in un array e ci fai quello che vuoi ...

Se ne è parlato infinite volte qui sul forum ... e ci sono sicuramente degli esempi fatti in tanti post ... fai un po' di ricerche ... :wink:

Guglielmo

volevo chiederti (visto che sembri abbastanza ferrato in materia ) quanto tempo impiega un arduino uno a ricevere un carattere alla massima velocita possibile esempio tra 2 arduino uno a pochi cm di distanza

void setup() {
  Serial.begin(9600);
 char * origine = "ciao a tutti 123ab";
char destinazione[6];

strcpy(destinazione, &origine[12]);
Serial.println(origine);
Serial.println(destinazione);

}

void loop() {

  
}

OK questo ti dovrebbe funzionare.

comunque questo e il bello del "C" che e un linguaggio infinito pieno di librerie e quindi di moltissime istruzioni aggiuntive. infatti e proprio questo che fa diventare il C uno dei linguaggi più potenti e utili, ha differenza degli altri.
comunque nel C bisognià avere delle basi seno ti risulta incasinato e inutile

@ gingardu : considera che un carattere trasmesso sulla seriale è composto da 1 bit di start + N bit di dati + a seconda della configurazione, può esserci 1 bit di parità e, per finire X bit di stop.

La configurazione usata la decidi nel Serial.begin(speed, config).

Tutti normalmente usano fare solo Serial.begin(speed) ... il che significa che prendono la configurazione di default che è 8 bit di dati, nessuna parità e 1 bit di stop : 8N1. In realtà le configurazioni sono molte di più e, quelle supportate da Arduino le trovi QUI.

Ora ... 1 START + 8 DATA + 1 STOP sono 10 bit ... e quindi puoi facilmente calcolarti da solo quanto tempo occorre per trasmettere 1 carattere a seconda della velocità, che è espressa in bps (bit per second).

Ad esempio ... ai classici 9600 bps hai : 9600/10 = 960 char/sec. = 0.0010417 Sec/Char ... :wink:

Guglielmo

Gabriel-99:

OK questo ti dovrebbe funzionare.

Emmm … è praticamente quello che avevo messo io pochi post prima … :wink:

Il problema di danyevo non era tanto di codice ma … era la mancanza di conoscenza del concetto di “visibilità di una variabile” … che è ben più importante … :roll_eyes:

Guglielmo