Problema stampa array

di il
3 risposte

Problema stampa array

Salve a tutti,
ho scritto un programmino in C per andare a leggere un integrato GPS.
L'integrato qualcosa stampa ma perdo dei caratteri. Il prof. mi ha detto che probabilmente è dovuto alla differenza di velocità tra l'integrato e la stampa del compilatore suggerendomi di aggiungere un banale buffer.

Questa di seguito è la gestione degli interrupt relativo alla parte di lettura.


#define size (100)

static char GPS_buff[size];
volatile char *data=GPS_buff;

extern volatile bool contr_GPS;

int i=0;
int a=100;

static void process_irq(uint8_t dev) {
UART_Type *uart = uart_reg[dev];

	if (uart->S1 & UART_S1_RDRF_MASK) {        //seconda parte che gestisce la lettura
		//(void)uart->D;
		if(a--)
		{
			*data++ = uart->D;
			//printf("%c", GPS_buff[i]);

		}
		else
		{
		uart->C2 &= ~UART_C2_RIE_MASK;
		contr_GPS = true;
		//print_data();
		}
		//printf("%c",uart->D);
	}

}
La funzione stampa presente nel medesimo file:
void print_data()
{
	for (int j=0; j<size; j++)
	printf("%c", GPS_buff[j]);
/*
	{if (j%100)
					printf("%c", GPS_buff[j]);

	else 	{
					printf("\r\n");
					printf("%c", GPS_buff[j]);
			}
	}
*/
}
In un altro file ho il main con:

volatile bool contr_GPS = false;

if (contr_GPS)	print_data();
Facendo diverse prove spostando 'printf' mi sono accorto che stampa solo dall'interno dell'interrup ma se l'avvio con il buffer no.
Il compilatore non segna errori.
Che c'è? Avete da suggerirmi altri modi per gestire il buffer?

Grazie per ogni aiuto

3 Risposte

  • Re: Problema stampa array

    Prima di tutto: il compilatore non ha problemi e non può segnalarti errori diciamo "progettuali" ! In una funzione di interrupt non puoi richiamare una printf() ma non è una regola del compilatore ma una regola dettata dal buon senso (o comunque una buona pratica di programmazione). Nel gestire un interrupt devi eseguire il minor numero di operazioni: in questo caso al ricevimento di caratteri devi solo salvarli in un buffer e aggiornare la dimensione di tale buffer; la stampa del contenuto di tale buffer lasciala fare al ciclo principale!
    Ora ritornando al tuo problema: perchè nella routine non aggiorni GPS_buff[] e perchè non aggiorni size?
  • Re: Problema stampa array

    Scusa per il ritardo e grazie per la risposta.

    Sì sì...so che non è la prassi ma volevo vedere se funzionava e ci ho messo anche printf ...

    Perchè non aggiorno GPS_buff[]?? Ho il puntatore *data che segue gli elementi del GPS_buff e li aggiorna ma mano che vengono nuovi dati in RX nel registro D....è uguale anche per size...perchè lo dovrei aggironare utilizzo il puntatore *data++
    Non è così?? o ti riferivi ad altro??
  • Re: Problema stampa array

    Scusa, ho visto dopo l'inizializzazione del puntatore data; ad ogni modo ti consiglio di tenere traccia con un indice (variabile intera) la posizione all'interno del buffer e magari scrivi direttamente in GPS_buff[].
    Nella funzione print_data() non stampare tutto il buffer GPS_buff[]; stampa solo i caratteri effettivamente ricevuti, il numero di caratteri da stampare lo ottieni dall'indice di cui sopra.
Devi accedere o registrarti per scrivere nel forum
3 risposte