Comunicazione arduino pic tramite seriale

Salve a tutti, ho collegato un PIC16f887 ad un Arduino mega 2560 tramite seriale (uart),quindi usando solo i piedini Rx e Tx.Ho problemi con lo scambio d’informazioni tra i due; ho scritto il codice ma ho problemi con la sincronizzazione.
Le operazioni sono le seguenti:

1)Arduino… invia 3 dati
2)Pic…leggi i 3 dati
3)Pic…invia 4 dati
4)Arduino… ricevi 4 dati

ho provato in tanti modi mettendo istruzioni di controllo(if while) ma niente…ho bisogno necessariamente di qualche segnale aggiuntivo?
Di seguito è postato il codice con qualche piccolo commento.
Ringrazio anticipatamente chi volesse aiutarmi, dandomi qualche suggerimento.

CODICE ARDUINO:

int id=3;
int letto=0;
unsigned int myInt[2]={4,2};; // 1 int 2 bytes
unsigned int k [4] = {0,2,3,4};
int buffer;
int volte=0;
byte LSB,MSB,LSB1,MSB1;
byte b[4]={0,0,0,0};
int c=0;
char buf[3];
void setup()
{
    Serial.begin(9600);
}


void encrypt (unsigned int* v, unsigned int* k) {
    unsigned int v0,v1, sum, i;
    unsigned int delta;
    unsigned int k0, k1, k2, k3;   /* chiave */
    delta=3;
    v0=v[0];
    v1=v[1];
    sum=0;
    k0=k[0];
    k1=k[1];
    k2=k[2];
    k3=k[3];
    for (i=0; i < 32; i++) {
        sum += delta;
        v0 += ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
        v1 += ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
    }
    v[0]=v0;
    v[1]=v1;
}

void loop()
{
  //MANDO I 3 DATI AL PIC CIOE' id,myInt[0],myInt[1]
        Serial.println(id,DEC);
         delay(1000);
        Serial.println(myInt[0],DEC);
         delay(1000);
        Serial.println(myInt[1],DEC);
         encrypt(myInt,k);
          LSB = myInt[0] & 0xff;
          MSB = (myInt[0] >> 8) & 0xff;
          LSB1 = myInt[1] & 0xff;
          MSB1 = (myInt[1] >> 8) & 0xff;
          
        
//leggo 4 dati dal PIC         
 if (Serial.available())
    {     
               b[0]=Serial.read();
           delay(100);
                b[1]=Serial.read();
          delay(100);
              b[2]=Serial.read();
           delay(100);
             b[3]=Serial.read();
                delay(100);
          //se le codifiche sono uguali fai suonare un cicalino
          if ((LSB==b[0])&&(MSB==b[1])&& (LSB1==b[2])&&(MSB1==b[3]))
           {
         for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=2) 
        { 
         analogWrite(9, fadeValue);         
          delay(15);
        }               
           }
           }
}

CODICE PIC:

#include "built_in.h"
unsigned int myInt[2];
unsigned buffer[4];
unsigned int k [4] = {0,2,3,4};
int ident=0;

void encrypt (unsigned int* v, unsigned int* k) {
    unsigned int v0,v1, sum, i;
    unsigned int k0, k1, k2,k3;
    unsigned int delta;
    v0=v[0]; v1=v[1]; sum=0;
    delta=3;
    k0=k[0]; k1=k[1]; k2=k[2]; k3=k[3];
    for (i=0; i < 8; i++) {
        sum += delta;
        v0 += ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
        v1 += ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
    }
    v[0]=v0;
    v[1]=v1;
}

void main()
{
      //LEGGE identificativo e dati mandati dall'arduino
     ident=UART1_Read();
     Delay_ms(100);
     myInt[0]=UART1_Read();
     Delay_ms(100);
     myInt[1]=UART1_Read();
     Delay_ms(100);

encrypt(myInt,k);
buffer[0] = Lo(myint[0]);
buffer[1] = Hi(myint[0]);
buffer[2] = Lo(myint[1]);
buffer[3] = Hi(myint[1]);
//mando 4 dati all'arduino
UART1_Write(buffer[0]);
Delay_ms(100);
UART1_Write(buffer[1]);
Delay_ms(100);
UART1_Write(buffer[2]);
Delay_ms(100);
UART1_Write(buffer[3]);
}

Non ho mai usato i pic, comunque vedendo il codice non ho trovato il parametro del baud rate... assicurati che anche il pic legge a 9600bps Ciao e scusami se non sono stato di aiuto

figurati grazie lo stesso :)...anche il baud rate per il Pic è fissato a 9600..scambiano correttamente informazioni ma non so ad esempio come far aspettare il pic...deve leggere i dati dopo che l'arduino li ha scritti

devi mettere un carattere di inizio trasmissione e uno di fine ;) tipo /\

e un caratteri di procedi,ti conviene inviare un dato alal volta lo elabori e poi tramite un carattere speciale dici ad arduino di mandare il prossimo cosi non rischi di perderti qualcosa :grin:

grazie mille per le risposte :)....mi potreste x favore fare un esempio di codice che implementa il protocollo con i caratteri di sincronizzazione...ho difficoltà nell'implementare quanto mi avete detto...grazie ancora

La Mega2560 ha 4 seriali hardware. Potresti spostare la connessione al PIC sulla seconda seriale [Serial1 sui pins 19 (RX) and 18 (TX)] e usare la prima per il debug tramite serial monitor.

C'è anche la possibilità, dell'IDE 1.0, e quindi anche con la 1.0.1 di usare la funzione Serialevent() --> http://arduino.cc/en/Tutorial/SerialEvent (http://arduino.cc/en/Reference/SerialEvent) però solo per leggere i dati, non per inviarli.

Nota: Le seriali sul Mega sono Serial, Serial1, Serial2 e Serial3. La seconda è la Serial1 :grin:

void setup()
{
Serial.begin(9600); // Collegamento al Serial Monitor
Serial1.begin(9600); // Collegmaneto al PIC - 18 tx - 19 rx
}

ecc.. ecc..