Interrupção interferindo na leitura da Serial.

Salve a todos.
Tenho um sketch que realiza o controle de carga de uma resistência e recebe e envia comandos para uma aplicação em C# via serial.
Mas estou tendo problemas na leitura dos dados vindos da serial, pelo que percebi as interrupções oriundas da passagem por zero do circuito interferem na leitura da serial de modo que os dados vindos da serial estão sendo perdidos, como solução estou tentando desabilitar a interrupção durante a leitura da serial mas sem sucesso. Help

#include <OneWire.h>
#include <DallasTemperature.h>
#include <PID_v1.h>

const uint8_t BUFFER_SIZE = 50;
uint8_t size = 0;
char buffer[BUFFER_SIZE];

#define LoadR 3  

int porta_rele = 7;

int SensorPin = 8;

#define LM35 0
#define DS18B20 1

#define kp 50
#define ki 10
#define kd  0

double SetPoint, PresentValue, ManipulatedValue;

volatile int power = 100;  
long t;
int OnBomba;

OneWire DS(SensorPin);  
DallasTemperature Sensor(&DS);

PID pid(&PresentValue, &ManipulatedValue, &SetPoint, kp, ki, kd, DIRECT);


void setup()
{
 Serial.begin(9600);
 
 Sensor.begin();
 pinMode(LoadR, OUTPUT);
 pinMode(porta_rele, OUTPUT);
 digitalWrite(porta_rele,HIGH);
 attachInterrupt(0, zero_crosss_int, RISING); 
 pid.SetOutputLimits(10, 240);
 pid.SetMode(AUTOMATIC); 
 SetPoint=35;
 OnBomba=0;
 t=millis();
}

void zero_crosss_int()  
{
 int powertime = (32*(256-power));      
 delayMicroseconds(powertime);   
 digitalWrite(LoadR, HIGH);  
 delayMicroseconds(8.33);      
 digitalWrite(LoadR, LOW);
}

float GetTemp(int sensor)
{
 float temp = 0;
 switch (sensor) {
   case LM35:
     for(int i=0; i< 5;i++)
     {
       temp += analogRead(sensor);
       delay(20);
     }
     temp = (temp * 0.48875855)/5;
   break;
   case DS18B20:
     /*for(int i=0; i< 5;i++)
     {
       //Envia comando para obter as temperatura
       Sensor.requestTemperatures();
       //Temperatura em Celsius para o dispositivo no indice 0
       //é possivel se ter varios sensores ligados no mesmo pino do arduino
       temp += Sensor.getTempCByIndex(0);
       delay(20);
     }
     temp = temp / 5;*/
     Sensor.requestTemperatures();
     temp = Sensor.getTempCByIndex(0);
   break;
 }  
 return (float)temp;
}

void DecodificaComando(char* data) {
 Serial.println(data);
 String comando = "";
 char* tmp; 
 int i = 0;
 tmp = strtok (data, "|");
 while (tmp != NULL) {
   String comando(tmp);
   if(comando.substring(0,1) == "[" && comando.substring(comando.length()-1,comando.length()) == "]")
   {
     if (comando.substring(1,5) == "BOMB")
     {
       if (comando.substring(6,7) == "1"){
           OnBomba = 1;
           digitalWrite(porta_rele, LOW);  //Liga
       }
       else {
         OnBomba = 0;
         digitalWrite(porta_rele, HIGH); //Desliga
       }
     }
 
     if (comando.substring(1,5) == "SETP")
     {
       SetPoint = StrToFloat(comando.substring(6,13));
     }
   }
   tmp = strtok(NULL, "|");
 }
 
 buffer[size] = 0;
 size = 0;
}

float StrToFloat(String str)
{
 char carray[str.length() + 1]; 
 str.toCharArray(carray, sizeof(carray));
 return atof(carray);
}

void RecebeDados (){
 while (Serial.available()) {
   char c = Serial.read();
 }
     DecodificaComando(buffer);
}

void EnviaDados (){
   Serial.print("[SETP:");
    Serial.print(SetPoint,2);
    Serial.println("]|");
   
   Serial.print("[TEMP:");
    Serial.print(PresentValue);
    Serial.println("]|");
   
   Serial.print("[BOMB:");
    Serial.print(OnBomba);
    Serial.println("]|");
}

void loop()
{   
 PresentValue = (double)GetTemp(DS18B20);

 if (Serial.available() > 0)
 {
   detachInterrupt(0);    
   Serial.println("Dados na Serial:");
   RecebeDados();
   attachInterrupt(0, zero_crosss_int, RISING);
 }
 
 pid.Compute();

 power = ManipulatedValue;
 
 if ((millis()-t) >= 200)
 { 
   EnviaDados();
   t=millis();
 }
}

#7 >>> http://forum.arduino.cc/index.php/topic,148850.0.html