connecting arduimu to arduino uno via serial

here is the code i modified from ardupilot soure code for arduimu …i don’t know whas wrong…
all i get is just OK when checking only checksum_a …very rarely may be due to incorrect data givivg the same checksum by chance…
i don’t know whether connecting arduimu via rx…while serial.printing i right…coz both rx , tx and usb port are connected to one USART in uno…i guess it is possible only if using rx ONLY for ardu imu …while serialprint is used for usb…am i right

i tried to monitor income serial data from arduimu …i noticed that sometimes data is missing one byte or 2…meaning lower performance of the sensor…should i go for connecting sensor via spi n i2c , do coding in uno without ATMega chip on arduimu??

as u notice i tried to first fill in the incoming buffer into array of 26bytes while 13byte in each frame are received…i supposed that processing buffer is more right …to avoid synchronizing problem if i processed on the buffer itself…that’s why i filled in the array with sequential serial.readS… :relaxed: i guess i have severe misconception…

#include <Servo.h>


      Servo myservo;
      float roll=0,pitch=0,yaw=0;
      byte byte_4,byte_3,byte_2,byte_1;
      byte imu[6]; 
      byte buff[26];
      byte IMU_ck_a=0, IMU_ck_b=0;
      byte ck_a=0,ck_b=0;
      byte bad_ck=0;
      byte num=0,done=0, b=0,data=0,imu_step=0,j=0;
     
      
     void setup() { 

     Serial.begin(9600); 
     myservo.attach(7);

     } 

     void loop() { 
       
       if(Serial.available()){/*
         buff[0]=Serial.read();
         buff[1]=Serial.read();
         buff[2]=Serial.read();
         buff[3]=Serial.read();
         buff[4]=Serial.read();
         buff[5]=Serial.read();
         buff[6]=Serial.read();
         buff[7]=Serial.read();
         buff[8]=Serial.read();
         buff[9]=Serial.read();
         buff[10]=Serial.read();
         buff[11]=Serial.read();
         buff[12]=Serial.read();
         buff[13]=Serial.read();
         buff[14]=Serial.read();
         buff[15]=Serial.read();
         buff[16]=Serial.read();
         buff[17]=Serial.read();
         buff[18]=Serial.read();
         buff[19]=Serial.read();
         buff[20]=Serial.read();
         buff[21]=Serial.read();
         buff[22]=Serial.read();
         buff[23]=Serial.read();
         buff[24]=Serial.read();
         buff[25]=Serial.read();
        */ 
       
        for (int k=0;k<26;k++){
           buff[k]=Serial.read();
        }
         done=0;
         for (int i=0;i<26;i++){
           data = buff[i];
           switch(imu_step){
             case 0:
                   if(data == 'a'){
                   imu_step++;
                 } 
                 break;   
             case 1:
                   if(data == 'b'){
                   imu_step++;
                   }
                   else {
                     imu_step=0;
                   }
                     break;
             case 2:
                   if(data == 'c'){
                   imu_step++;
                   }   else{
                     imu_step=0; 
                   }
                   break;
             case 3:
                   if(data == 'd'){
                   imu_step++;
                   Serial.println("ok");
                   }  else{
                     imu_step=0;
                   }
                     break;
             case 4:
                   {imu[j] = data;
                   ck_a+=imu[i];  
                   ck_b+=ck_a;
                   j++;
                    if (j > 6) {
                      imu_step++;
                    }
                    break;}
             case 5:
                   {IMU_ck_a=data; 
                   imu_step++;
                   break;}
             case 6:
                   {IMU_ck_b=data;
                   done=1;
                    if((ck_a == IMU_ck_a) /*&& (ck_b == IMU_ck_b)*/) 
                    {
                      roll=imu[0]|(imu[1]<<8);
                      Serial.println("    good");
                    }else{
                      bad_ck++;
                      Serial.println("          bad");
                      //Serial.println(bad_ck);
                      //Serial.println(b);
                      // Serial.println(imu[0]);
                    }
                    imu_step=0;
                    j=0;
                    ck_a=0;
                    ck_b=0;
                    break;}
            }
            if(done==1)
            break;
          }
        }
     }

this is the buffer sent by arduimu

byte IMU_buffer[9];
	int tempint;
	//int ck;
	long templong;
	byte IMU_ck_a=0;
	byte IMU_ck_b=0;
      
	//  This section outputs the gps binary message when new gps data is available
	
      
		// This section outputs the IMU orientatiom message
		Serial.print("abcd");  // This is the message preamble
		//IMU_buffer[0]=0x06;
		//ck=6;
		//IMU_buffer[1] = 0x02;      

		tempint=ToDeg(roll)*100;  //Roll (degrees) * 100 in 2 bytes
		IMU_buffer[0]=tempint&0xff;
		IMU_buffer[1]=(tempint>>8)&0xff;
      
		tempint=ToDeg(pitch)*100;   //Pitch (degrees) * 100 in 2 bytes
		IMU_buffer[2]=tempint&0xff;
		IMU_buffer[3]=(tempint>>8)&0xff;
      
		templong=ToDeg(yaw)*100;  //Yaw (degrees) * 100 in 2 bytes
		if(templong>18000) templong -=36000;
		if(templong<-18000) templong +=36000;
		tempint = templong;
		IMU_buffer[4]=tempint&0xff;
		IMU_buffer[5]=(tempint>>8)&0xff;
      
		for (int i=0;i<6;i++) Serial.print (IMU_buffer[i]);
	  
		for (int i=0;i<6;i++) {
			IMU_ck_a+=IMU_buffer[i];  //Calculates checksums
			IMU_ck_b+=IMU_ck_a;       
		}
		Serial.print(IMU_ck_a);
		Serial.print(IMU_ck_b);

shuold i go for using interrupts with usart ?? but i guess interrupts make an overhead on processing power..while this IMU used
on quadcopter, which may cause lower performance....i guess

i guess i have severe misconception.

Yes the first one is that you check that at least one byte has arrived in the serial buffer and then you read 26 bytes from it if they have all arrived or not.