Come giustamente ti diceva
WALTERmwp per sapere esattamente e con sicurezza quando un messaggio (flusso dati) inizia e termina, serve sapere esattamente come è strutturato.
Normalmente, i dati da trasmettere (soprattutto quando non sono di per se intrepretabili) vengono divisi in pacchetti di varia lunghezza ed incapsulati in una struttura dati maggiormente definita, che prende il nome di frame relativo ad un protocollo di comunicazione (alcuni sono standardizzati, molti altri custom).
La struttura tipica di questi frame prevede 3 parti: un preambolo, un corpo dati significativi ed un epilogo.
In genere nel preambolo c'è uno o più caratteri di riconoscimento di inizio frame, altri dati come l'identificativo di chi invia il frame, quello della destinazione, la lunghezza del frame etc.
Nel corpo dati, chiamato in gergo payload, ci sono appunto l'insieme dei dati trasmessi; spesso se l'insieme di dati da inviare è di lunghezza rilevante viene divisi in blocchi di lungezza fissa o massima ed inviati in una serie di frames contigui.
Nell' epilogo di solito ci sono alcuni byte per verificare la congruenza dei dati ricevuti (checkum o crc)
ed uno o più caratteri di riconoscimento di fine frame;
Generalmente per decodificare un protocollo si costruisce un loop di polling del dato in arrivo sulla fifo di ricezione e quando arriva, si invia il dato ad una macchina a stati finiti che provvede ad analizzare step-by-step le varie sequenze di caratteri in arrivo.
Le funzioni tipiche di questa macchina a stati sono:
- sincronizzazione con l'inizio del frame;
- determinazione della provenienza e della destinazione del frame
- determinazione della quantità e natura dei dati del payload
- separazione del payload dal frame ed eventuale ricomposizione
- sincronizzazione con la fine del frame
- controllo di congruenza sui dati ricevuti
- invio di una risposta se richiesta.
Successivamente il payload integro viene ulteriomente analizzato e utilizzato.
Pensavo di usare un timer, in modo tale che da quando parte l'interrupt conto XXXms e poi manipolo la stringa. Ovviamente i millisecondi impostati devono essere sufficienti a ricevere qualsiasi stringa, però non mi piace molto come soluzione.
L'espediente di stabilire un tempo massimo in cui deve arrivare tutto il pacchetto di dati per stabilire che è terminato, purtroppo è una strada ad alto rischio, che può andar bene oggi, in una certa situazione ma non saprai mai se domani potrà arrivarti un pacchetto più lungo, o per una qualsiasi ragione di latenza incerta si verificherà un caso in cui sfori questo tempo che è hard-coded. Inoltre se abbondi col tempo rischi di avere una situazione di over-run fra trasmissioni successive
Purtroppo non lavorando con i PIC non ho esempi semplici da passarti, ma sono sicuro che gli altri firmwaristi 'PIC aficionados'

che frequentano EY da molto prima di me, sapranno aiutarti nello specifico.
