Caio a tutti,
sono alle prese con un piccolo firmware su AVR che mi sta dando un po' da fare non essendo molto esperto di programmazione.
Tramite un interrupt su UART memorizzo i dato all'interno di un vettore "A".
Durante l'esecuzione del programma (nel main) vorrei chiamare una funzione che legga tutto il vettore "A" e identificare una precisa sequenza di caratteri per memorizzarla all'interno di un altro vettore "B" sempre di tipo Char, che poi lo userò nel main.
Ho già fatto qualcosa ma mi da errori di compilazione.
Qualcuno saprebbe darmi una mano? Grazie
Ricerca in Array di char in C
Moderatore: Paolino
17 messaggi
• Pagina 1 di 2 • 1, 2
0
voti
Risposta non troppo appropriata (in un altro contesto avrei usato una espressione diversa )
Hai chiesto a ChatGPT?
P.S. la mia (non) risposta mi serve per capire come "tira il vento"
Hai chiesto a ChatGPT?
P.S. la mia (non) risposta mi serve per capire come "tira il vento"
0
voti
Dopo aver chiesto alle imitazioni di intelligenza riporta qui che son curioso
E poi metti quello che hai fatto finora che ci provo ad aiutarti
E poi metti quello che hai fatto finora che ci provo ad aiutarti
-
standardoil
460 2 4 - Stabilizzato
- Messaggi: 368
- Iscritto il: 15 lug 2022, 19:14
0
voti
ci devi almeno dire di piu'. Quale e' la sequenza che ti aspetti? E' una sequenza nota e vuoi solo vedere se c'e'? E' una roba delimitata da due caratteri?
Io mi sto aspettando una cosa tipo asdoijsadoij-simbolo-asdijaosidj e vuoi ritornare "simbolo" perche' e' delimitato da due trattini.
In quel caso basta fare un ciclo for che scorre tutto il vettore, segnarti la posizione dei due trattini, se ce ne sono esattamente due allora copi la stringa a partire da posizione-trattino-1 fino a posizione-trattino-2 altrimenti se ce ne sono un numero diverso da 2 ritorni un errore.
Io mi sto aspettando una cosa tipo asdoijsadoij-simbolo-asdijaosidj e vuoi ritornare "simbolo" perche' e' delimitato da due trattini.
In quel caso basta fare un ciclo for che scorre tutto il vettore, segnarti la posizione dei due trattini, se ce ne sono esattamente due allora copi la stringa a partire da posizione-trattino-1 fino a posizione-trattino-2 altrimenti se ce ne sono un numero diverso da 2 ritorni un errore.
0
voti
PArlando di stringhe e di char ricordati che implicitamente accetti due condizioni
la tua sesquenza NON può contenere il valore zero
la tua sequenza termina quando si incntra un byte uguale a zero
Cosa non scontata parlando di sequenze ricevute da porta seriale. Devi assicurarti che sia terminata correttamente con un valore zero, eventualmente lo aggiungi tu alla fine, quando copi la sequenza da A a B
Diversamente io al posto di char utilizzerei uint8_t per definire un vettore generico. In questo caso però è obbligatorio un secondo parametro conoscere il numero di elementi contenuti
la tua sesquenza NON può contenere il valore zero
la tua sequenza termina quando si incntra un byte uguale a zero
Cosa non scontata parlando di sequenze ricevute da porta seriale. Devi assicurarti che sia terminata correttamente con un valore zero, eventualmente lo aggiungi tu alla fine, quando copi la sequenza da A a B
Diversamente io al posto di char utilizzerei uint8_t per definire un vettore generico. In questo caso però è obbligatorio un secondo parametro conoscere il numero di elementi contenuti
-
luxinterior
4.042 3 4 9 - Master
- Messaggi: 2557
- Iscritto il: 6 gen 2016, 17:48
0
voti
Allora provo a spiegare un attimo:
Tramite UART memorizzo in un vettore questa stringa:
DDFS,$587.455,564.300,L,,,,,,,,150,5555,,,55555,,
Sono circa 50 caratteri e ho creato un vettore di 100 byte (DIM_BUFFER) chiamato:
A me interessano i 7 byte successivi al "$" e salvarli nel vettore array. Vorrei creare una funzione per poi richiamarla nel main. Quindi ho fatto un ciclo for di questo tipo:
Mi stavo chiedendo se concettualmente così è corretto. Posso passagli un array a una funzione ? O gli devo passare il puntatore?
Tramite UART memorizzo in un vettore questa stringa:
DDFS,$587.455,564.300,L,,,,,,,,150,5555,,,55555,,
Sono circa 50 caratteri e ho creato un vettore di 100 byte (DIM_BUFFER) chiamato:
- Codice: Seleziona tutto
char RXbuffer [DIM_BUFFER];
char array[7];
A me interessano i 7 byte successivi al "$" e salvarli nel vettore array. Vorrei creare una funzione per poi richiamarla nel main. Quindi ho fatto un ciclo for di questo tipo:
- Codice: Seleziona tutto
oid get_array (char RXbuffer,DIM_BUFFER){
int i,n,timestep;
bool v=false;
for (i=0;i<DIM_BUFFER;i++) {
if (RXbuffer[i]=="$") {
for (n=0;n<7;n++) {
array[n]=RXbuffer[i];
}
return 0;
break;
}
}
}
Mi stavo chiedendo se concettualmente così è corretto. Posso passagli un array a una funzione ? O gli devo passare il puntatore?
1
voti
gli devi passare il puntatore. E nella parte che salvi non devi salvare dall'indice i ma dall'indice i+1. Cosi' appena trovi $ inizi a salvare, quindi $ e' compreso nel salvataggio mentre tu invece vuoi partire dal carattere successivo.
(anche senza arduino, scaricati gcc sul computer e prova le tue funzioni in locale prima di metterle sul micro, cosi' sul PC hai debugger e tutto quello che serve)
(anche senza arduino, scaricati gcc sul computer e prova le tue funzioni in locale prima di metterle sul micro, cosi' sul PC hai debugger e tutto quello che serve)
0
voti
Non va bene per molti motivi.
Innanzitutto se non inizializzi il buffer ad un valore noto potresti avere qualsiasi cosa al suo interno e poiché vai a cercare oltre i caratteri ricevuti (dici circa 50 e dimensioni a 100) potresti ottenere cose strane.
Poi ti devi fermare a NumeroCaratteriRicevuti - 7 (passi DIM_BUFFER-7), poiché se trovi un dollaro oltre questo limite dopo non hai spazio per un numero formattato correttamente (7 caratteri).
poi dici che non compila.
Che errore da?
Innanzitutto se non inizializzi il buffer ad un valore noto potresti avere qualsiasi cosa al suo interno e poiché vai a cercare oltre i caratteri ricevuti (dici circa 50 e dimensioni a 100) potresti ottenere cose strane.
Poi ti devi fermare a NumeroCaratteriRicevuti - 7 (passi DIM_BUFFER-7), poiché se trovi un dollaro oltre questo limite dopo non hai spazio per un numero formattato correttamente (7 caratteri).
poi dici che non compila.
Che errore da?
0
voti
tra l'altro, la condizione:
dovrebbe essere:
Poi, ma questo è solo "design", il buffer passato come argomento, mentre l'array del risultato acceduto come variabile globale?
Si potrebbe fare così (a memoria, non testato):
Da usare con:
- Codice: Seleziona tutto
RXbuffer[i]=="$"
dovrebbe essere:
- Codice: Seleziona tutto
RXbuffer[i]=='$'
Poi, ma questo è solo "design", il buffer passato come argomento, mentre l'array del risultato acceduto come variabile globale?
Si potrebbe fare così (a memoria, non testato):
- Codice: Seleziona tutto
#define DIM_BUFFER 100
char RXbuffer [DIM_BUFFER];
char array[7];
- Codice: Seleziona tutto
bool get_array() {
int i;
for (i=0; i<(DIM_BUFFER-7); i++)
if (RXbuffer[i] == '$') {
memcpy(array, RXbuffer+i+1, 7);
return 1;
}
return 0;
}
Da usare con:
- Codice: Seleziona tutto
if (get_array()) { ... }
Ultima modifica di djnz il 12 dic 2023, 20:41, modificato 4 volte in totale.
Una domanda ben posta è già mezza risposta.
17 messaggi
• Pagina 1 di 2 • 1, 2
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 5 ospiti