teste de publish

Dependencies:   DS1820 HighSpeedAnalogIn devices mbed

Revision:
32:7cf1fb8a8bf3
Parent:
26:c246eacf6815
Child:
37:0e95c85f0160
--- a/modbusMaster1.cpp	Sat May 26 13:00:00 2018 +0000
+++ b/modbusMaster1.cpp	Sat May 26 14:17:55 2018 +0000
@@ -1,4 +1,6 @@
 #include "modbusMaster1.h"
+#define maxRetentativas 5
+#define maxDelayEntreTentativas 100
 //RAD
 enum {
     READ_COIL_STATUS = 1,
@@ -14,6 +16,7 @@
 uint16_t modBusMaster1::T3_5;
 uint16_t modBusMaster1::T1_5;
 bool modBusMaster1::pacoteEmEspera;
+bool modBusMaster1::pacoteEmEsperaValido;
 uint16_t modBusMaster1::MODBUS_TIMEOUT;
 bool modBusMaster1::startThreadModBusMaster;
 Serial *modBusMaster1::serModBus;
@@ -49,9 +52,9 @@
     crc_calculado = modBusMaster1::CRC16(modBusMaster1::buffer,modBusMaster1::index-2);
     crc_lido = (modBusMaster1::buffer[modBusMaster1::index-2]<<8)+(modBusMaster1::buffer[modBusMaster1::index-1]);
     
-    
+    modBusMaster1::pacoteEmEspera=true;
     if(crc_calculado == crc_lido){
-        modBusMaster1::pacoteEmEspera=true;
+        modBusMaster1::pacoteEmEsperaValido=true;
     }
     //pc.printf("crc_calculado = 0x%02x, crc_lido = 0x%02x.\n",crc_calculado,crc_lido);
 }
@@ -117,54 +120,41 @@
 uint16_t modBusMaster1::sendFrame(uint16_t tamBytes){
     uint16_t timeout = modBusMaster1::MODBUS_TIMEOUT;
     uint16_t i;
-    uint16_t retentativas = 5;
-    uint16_t delayEntreTentativas = 500;
-    while(retentativas){
-        if(debug){
-            //DEBUG Mostrando o que é enviado via modbus
-            pc.printf("Frame enviado (hexa) <");
-            for(i=0;i<tamBytes;i++){       
-                pc.printf("%02x ",modBusMaster1::buffer[i]);                
-            }                
-            pc.printf(">.\n");
-        }
         
-        osDelay(5);    
-        
-        modBusMaster1::pacoteEmEspera = false;
-        modBusMaster1::index=0;
-        *modBusMaster1::de=1;    
-        //wait_us(1750);    
-        osDelay(2);    
+    if(debug){
+        //DEBUG Mostrando o que é enviado via modbus
+        pc.printf("Frame enviado (hexa) <");
         for(i=0;i<tamBytes;i++){       
-            modBusMaster1::serModBus->putc(modBusMaster1::buffer[i]);        
-            //wait_us(750);            
-            while( 
-            ((LPC_UART1->LSR >> 6) &0x1)
-             == 0 );
-             //wait_us(modBusMaster1::T1_5);
+            pc.printf("%02x ",modBusMaster1::buffer[i]);                
         }                
-        //wait_us(1750);    
-        //osDelay(1);    
-        *modBusMaster1::de=0;
-        
-        while((timeout>0)&&(modBusMaster1::pacoteEmEspera!=true)){
-            osDelay(1);        
-            //wait_us(1000);
-            timeout--;   
-        }         
-        wait_us(modBusMaster1::T3_5*2);
-        if((!timeout) && (!modBusMaster1::pacoteEmEspera)){
-            osDelay(delayEntreTentativas);
-            retentativas--;
-            if(debug){
-                //DEBUG Mostrando o que é enviado via modbus
-                pc.printf("Retentativa de comando modbus.\r\n");
-            }
-        }else{
-            retentativas = 0;
-         }
+        pc.printf(">.\n");
     }
+    
+    //osDelay(5);    
+    
+    modBusMaster1::pacoteEmEspera = false;
+    modBusMaster1::index=0;
+    *modBusMaster1::de=1;    
+    //wait_us(1750);    
+    osDelay(1);    
+    for(i=0;i<tamBytes;i++){       
+        modBusMaster1::serModBus->putc(modBusMaster1::buffer[i]);        
+        //wait_us(750);            
+        while( 
+        ((LPC_UART1->LSR >> 6) &0x1)
+         == 0 );
+         //wait_us(modBusMaster1::T1_5);
+    }                
+    //wait_us(1750);    
+    //osDelay(1);    
+    *modBusMaster1::de=0;
+    
+    while((timeout>0)&&(modBusMaster1::pacoteEmEspera!=true)){
+        osDelay(1);        
+        //wait_us(1000);
+        timeout--;   
+    }         
+    wait_us(modBusMaster1::T3_5*2);
     return timeout;
 }
 
@@ -181,30 +171,49 @@
     for(i=0;i<qtdRegistros;i++){
         var[i]=NULL;
     }
-    
-    modBusMaster1::buffer[0]=enderecoSlave;
-    modBusMaster1::buffer[1]=funcao;
-    modBusMaster1::buffer[2]=registrador>>8;
-    modBusMaster1::buffer[3]=(registrador & 0xFF);
-    modBusMaster1::buffer[4]=qtdRegistros>>8;
-    modBusMaster1::buffer[5]=(qtdRegistros & 0xFF);
-    
-    crc=modBusMaster1::CRC16(modBusMaster1::buffer,6);
-    
-    modBusMaster1::buffer[6]=crc>>8;
-    modBusMaster1::buffer[7]=(crc & 0xFF);       
-    
-    
-            
-    if(!modBusMaster1::sendFrame(8)){
-        pc.printf("Erro de timeout.\n");
-        return 254;   
+
+//-----------------Bloco de tentativas---------------------    
+    uint16_t retentativas = maxRetentativas+1;
+    uint16_t delayEntreTentativas = maxDelayEntreTentativas;
+    while(retentativas){    
+        modBusMaster1::buffer[0]=enderecoSlave;
+        modBusMaster1::buffer[1]=funcao;
+        modBusMaster1::buffer[2]=registrador>>8;
+        modBusMaster1::buffer[3]=(registrador & 0xFF);
+        modBusMaster1::buffer[4]=qtdRegistros>>8;
+        modBusMaster1::buffer[5]=(qtdRegistros & 0xFF);
+        
+        crc=modBusMaster1::CRC16(modBusMaster1::buffer,6);
+        
+        modBusMaster1::buffer[6]=crc>>8;
+        modBusMaster1::buffer[7]=(crc & 0xFF);       
+
+        if(!modBusMaster1::sendFrame(8)){
+            osDelay(delayEntreTentativas);
+            retentativas--;
+            if(debug){
+                //DEBUG Mostrando o que é enviado via modbus
+                pc.printf("Retentativa de comando modbus.\r\n");
+            }
+            if(retentativas==0){
+                //erro de timeout certamente
+                pc.printf("Erro de timeout.\n");
+                modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote
+                modBusMaster1::index = 0; 
+                return 254;                
+            }            
+        }else{
+            //Chegou pacote, vamos ver se é valido
+            retentativas = 0;            
+         }
     }    
-    
-    if(!modBusMaster1::pacoteEmEspera){
+    if(!modBusMaster1::pacoteEmEsperaValido){
         pc.printf("Erro de CRC.\n");
+        modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote
+        modBusMaster1::index = 0;
         return 255;    
     }
+//-----------------Bloco de tentativas---------------------    
     
     if(modBusMaster1::buffer[1]&(0x1<<7)){        
         result = modBusMaster1::buffer[2];
@@ -227,61 +236,76 @@
 
 uint8_t modBusMaster1::writeSingleCoil(uint8_t enderecoSlave,uint16_t registrador,bool var){
     uint16_t crc;
-    uint8_t result = 1;    //Tudo ok ate que se prove o contrario.
     uint16_t estadoSetado;    
-
-    modBusMaster1::buffer[0]=enderecoSlave;
-    modBusMaster1::buffer[1]=5;
-    modBusMaster1::buffer[2]=registrador>>8;
-    modBusMaster1::buffer[3]=(registrador & 0xFF);
-    
-    if(var){
-        modBusMaster1::buffer[4]=0xFF;
-        modBusMaster1::buffer[5]=0x00;
-        estadoSetado = 0xFF00;
-            
-    }else{
-        modBusMaster1::buffer[4]=0x00;
-        modBusMaster1::buffer[5]=0x00;    
-        estadoSetado = 0x0000;
-     }
-    
-    
-    crc=modBusMaster1::CRC16(modBusMaster1::buffer,6);
-    
-    modBusMaster1::buffer[6]=crc>>8;
-    modBusMaster1::buffer[7]=(crc & 0xFF);       
-    
+    uint8_t result = 0;
+    //-----------------Bloco de tentativas---------------------    
+    uint16_t retentativas = maxRetentativas+1;
+    uint16_t delayEntreTentativas = maxDelayEntreTentativas;
+    while(retentativas){
+//------------Bloco de construcao de frame request----------    
+        modBusMaster1::buffer[0]=enderecoSlave;
+        modBusMaster1::buffer[1]=5;
+        modBusMaster1::buffer[2]=registrador>>8;
+        modBusMaster1::buffer[3]=(registrador & 0xFF);
+        
+        if(var){
+            modBusMaster1::buffer[4]=0xFF;
+            modBusMaster1::buffer[5]=0x00;
+            estadoSetado = 0xFF00;
+                
+        }else{
+            modBusMaster1::buffer[4]=0x00;
+            modBusMaster1::buffer[5]=0x00;    
+            estadoSetado = 0x0000;
+         }
+        
+        
+        crc=modBusMaster1::CRC16(modBusMaster1::buffer,6);
+        
+        modBusMaster1::buffer[6]=crc>>8;
+        modBusMaster1::buffer[7]=(crc & 0xFF);       
+//------------Bloco de construcao de frame request----------    
+        if(!modBusMaster1::sendFrame(8)){
+            osDelay(delayEntreTentativas);
+            retentativas--;
+            if(debug){
+                //DEBUG Mostrando o que é enviado via modbus
+                pc.printf("Retentativa de comando modbus.\r\n");
+            }
+            if(retentativas==0){
+                //erro de timeout certamente
+                pc.printf("Erro de timeout.\n");
+                modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote
+                modBusMaster1::index = 0; 
+                return 254;                
+            }            
+        }else{
+            //Chegou pacote, vamos ver se é valido
+            retentativas = 0;            
+         }
+    }    
+    if(!modBusMaster1::pacoteEmEsperaValido){
+        pc.printf("Erro de CRC.\n");
+        modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote
+        modBusMaster1::index = 0; 
+        return 255;    
+    }
+//-----------------Bloco de tentativas---------------------        
     
-            
-    if(!modBusMaster1::sendFrame(8)){
-        pc.printf("Erro de timeout.\n");
-        result = 254;
-        return result;
-    }    
-    
-    if(!modBusMaster1::pacoteEmEspera){
-        pc.printf("Erro de CRC.\n");
-        result = 255;
-        return result;
-    }
-    
-    if(result){
-        if(modBusMaster1::buffer[1]&(0x1<<7)){        
-            result = modBusMaster1::buffer[2];
-        }else{
-            if(
-                (((modBusMaster1::buffer[2]<<8)+(modBusMaster1::buffer[3]))==registrador)
-                    &&
-                (((modBusMaster1::buffer[4]<<8)+(modBusMaster1::buffer[5]))==estadoSetado) 
-            ){
-                result=0;
-             }else{
-                result=253;   
-              }
-         }    
-    }
-    
+
+    if(modBusMaster1::buffer[1]&(0x1<<7)){        
+        result = modBusMaster1::buffer[2];
+    }else{
+        if(
+            (((modBusMaster1::buffer[2]<<8)+(modBusMaster1::buffer[3]))==registrador)
+                &&
+            (((modBusMaster1::buffer[4]<<8)+(modBusMaster1::buffer[5]))==estadoSetado) 
+        ){
+            result=0;
+         }else{
+            result=253;   
+          }
+     }        
     modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote
     modBusMaster1::index = 0; 
     return result;    
@@ -291,31 +315,52 @@
     uint16_t crc;
     uint8_t result;    
     uint16_t i;
-    
-    modBusMaster1::buffer[0]=enderecoSlave;
-    modBusMaster1::buffer[1]=1;
-    modBusMaster1::buffer[2]=registrador>>8;
-    modBusMaster1::buffer[3]=(registrador & 0xFF);
-    modBusMaster1::buffer[4]=qtdRegistros>>8;
-    modBusMaster1::buffer[5]=(qtdRegistros & 0xFF);    
-    
-    crc=modBusMaster1::CRC16(modBusMaster1::buffer,6);
+//-----------------Bloco de tentativas---------------------    
+    uint16_t retentativas = maxRetentativas+1;
+    uint16_t delayEntreTentativas = maxDelayEntreTentativas;
+    while(retentativas){
+//------------Bloco de construcao de frame request----------    
+        
+        modBusMaster1::buffer[0]=enderecoSlave;
+        modBusMaster1::buffer[1]=1;
+        modBusMaster1::buffer[2]=registrador>>8;
+        modBusMaster1::buffer[3]=(registrador & 0xFF);
+        modBusMaster1::buffer[4]=qtdRegistros>>8;
+        modBusMaster1::buffer[5]=(qtdRegistros & 0xFF);    
+        
+        crc=modBusMaster1::CRC16(modBusMaster1::buffer,6);
+        
+        modBusMaster1::buffer[6]=crc>>8;
+        modBusMaster1::buffer[7]=(crc & 0xFF);       
     
-    modBusMaster1::buffer[6]=crc>>8;
-    modBusMaster1::buffer[7]=(crc & 0xFF);       
-    
-    
-            
-    if(!modBusMaster1::sendFrame(8)){
-        pc.printf("Erro de timeout.\n");
-        return 254;   
+//------------Bloco de construcao de frame request----------    
+        if(!modBusMaster1::sendFrame(8)){
+            osDelay(delayEntreTentativas);
+            retentativas--;
+            if(debug){
+                //DEBUG Mostrando o que é enviado via modbus
+                pc.printf("Retentativa de comando modbus.\r\n");
+            }
+            if(retentativas==0){
+                //erro de timeout certamente
+                pc.printf("Erro de timeout.\n");
+                modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote
+                modBusMaster1::index = 0; 
+                return 254;                
+            }            
+        }else{
+            //Chegou pacote, vamos ver se é valido
+            retentativas = 0;            
+         }
     }    
-    
-    if(!modBusMaster1::pacoteEmEspera){
+    if(!modBusMaster1::pacoteEmEsperaValido){
         pc.printf("Erro de CRC.\n");
+        modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote
+        modBusMaster1::index = 0; 
         return 255;    
     }
-    
+//-----------------Bloco de tentativas---------------------        
+            
     if(modBusMaster1::buffer[1]&(0x1<<7)){        
         result = modBusMaster1::buffer[2];
     }else{    
@@ -352,31 +397,53 @@
     for(i=0;i<qtdRegistros;i++){
         var[i]=NULL;
     }
-    
-    modBusMaster1::buffer[0]=enderecoSlave;
-    modBusMaster1::buffer[1]=funcao;
-    modBusMaster1::buffer[2]=registrador>>8;
-    modBusMaster1::buffer[3]=(registrador & 0xFF);
-    modBusMaster1::buffer[4]=qtdRegistros>>8;
-    modBusMaster1::buffer[5]=(qtdRegistros & 0xFF);
-    
-    crc=modBusMaster1::CRC16(modBusMaster1::buffer,6);
+
+//-----------------Bloco de tentativas---------------------    
+    uint16_t retentativas = maxRetentativas+1;
+    uint16_t delayEntreTentativas = maxDelayEntreTentativas;
+    while(retentativas){
+//------------Bloco de construcao de frame request----------    
+        
+        modBusMaster1::buffer[0]=enderecoSlave;
+        modBusMaster1::buffer[1]=funcao;
+        modBusMaster1::buffer[2]=registrador>>8;
+        modBusMaster1::buffer[3]=(registrador & 0xFF);
+        modBusMaster1::buffer[4]=qtdRegistros>>8;
+        modBusMaster1::buffer[5]=(qtdRegistros & 0xFF);
+        
+        crc=modBusMaster1::CRC16(modBusMaster1::buffer,6);
+        
+        modBusMaster1::buffer[6]=crc>>8;
+        modBusMaster1::buffer[7]=(crc & 0xFF);       
     
-    modBusMaster1::buffer[6]=crc>>8;
-    modBusMaster1::buffer[7]=(crc & 0xFF);       
-    
-    
-            
-    if(!modBusMaster1::sendFrame(8)){
-        pc.printf("Erro de timeout.\n");
-        return 254;   
+//------------Bloco de construcao de frame request----------    
+        if(!modBusMaster1::sendFrame(8)){
+            osDelay(delayEntreTentativas);
+            retentativas--;
+            if(debug){
+                //DEBUG Mostrando o que é enviado via modbus
+                pc.printf("Retentativa de comando modbus.\r\n");
+            }
+            if(retentativas==0){
+                //erro de timeout certamente
+                pc.printf("Erro de timeout.\n");
+                modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote
+                modBusMaster1::index = 0; 
+                return 254;                
+            }            
+        }else{
+            //Chegou pacote, vamos ver se é valido
+            retentativas = 0;            
+         }
     }    
-    
-    if(!modBusMaster1::pacoteEmEspera){
+    if(!modBusMaster1::pacoteEmEsperaValido){
         pc.printf("Erro de CRC.\n");
+        modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote
+        modBusMaster1::index = 0; 
         return 255;    
     }
-    
+//-----------------Bloco de tentativas---------------------        
+            
     if(modBusMaster1::buffer[1]&(0x1<<7)){        
         result = modBusMaster1::buffer[2];
     }else{
@@ -401,37 +468,58 @@
     uint16_t i;
     uint16_t crc;
     uint8_t result;
-    
-    modBusMaster1::buffer[0]=enderecoSlave;
-    modBusMaster1::buffer[1]=16;
-    modBusMaster1::buffer[2]=registrador>>8;
-    modBusMaster1::buffer[3]=(registrador & 0xFF);
-    modBusMaster1::buffer[4]=qtdRegistros>>8;
-    modBusMaster1::buffer[5]=(qtdRegistros & 0xFF);
-    modBusMaster1::buffer[6]=qtdRegistros*2;       
-    
-    for(i=0;i<qtdRegistros;i++){
-        modBusMaster1::buffer[(i*2)+7]=var[i]>>8;
-        modBusMaster1::buffer[(i*2)+8]=var[i]&0xFF;
-    }
+
+//-----------------Bloco de tentativas---------------------    
+    uint16_t retentativas = maxRetentativas+1;
+    uint16_t delayEntreTentativas = maxDelayEntreTentativas;
+    while(retentativas){
+//------------Bloco de construcao de frame request----------    
     
-    crc=modBusMaster1::CRC16(modBusMaster1::buffer,((qtdRegistros)*2)+7);
-    
-    modBusMaster1::buffer[(qtdRegistros*2)+7]=crc>>8;;
-    modBusMaster1::buffer[(qtdRegistros*2)+8]=(crc & 0xFF);
-    
-    
-    
-    //Enviando frame
-    if(!modBusMaster1::sendFrame((qtdRegistros*2)+9)){
-        pc.printf("Erro de timeout.\n");
-        return 254;   
+        modBusMaster1::buffer[0]=enderecoSlave;
+        modBusMaster1::buffer[1]=16;
+        modBusMaster1::buffer[2]=registrador>>8;
+        modBusMaster1::buffer[3]=(registrador & 0xFF);
+        modBusMaster1::buffer[4]=qtdRegistros>>8;
+        modBusMaster1::buffer[5]=(qtdRegistros & 0xFF);
+        modBusMaster1::buffer[6]=qtdRegistros*2;       
+        
+        for(i=0;i<qtdRegistros;i++){
+            modBusMaster1::buffer[(i*2)+7]=var[i]>>8;
+            modBusMaster1::buffer[(i*2)+8]=var[i]&0xFF;
+        }
+        
+        crc=modBusMaster1::CRC16(modBusMaster1::buffer,((qtdRegistros)*2)+7);
+        
+        modBusMaster1::buffer[(qtdRegistros*2)+7]=crc>>8;;
+        modBusMaster1::buffer[(qtdRegistros*2)+8]=(crc & 0xFF);
+        
+//------------Bloco de construcao de frame request----------    
+        if(!modBusMaster1::sendFrame((qtdRegistros*2)+9)){
+            osDelay(delayEntreTentativas);
+            retentativas--;
+            if(debug){
+                //DEBUG Mostrando o que é enviado via modbus
+                pc.printf("Retentativa de comando modbus.\r\n");
+            }
+            if(retentativas==0){
+                //erro de timeout certamente
+                pc.printf("Erro de timeout.\n");
+                modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote
+                modBusMaster1::index = 0; 
+                return 254;                
+            }            
+        }else{
+            //Chegou pacote, vamos ver se é valido
+            retentativas = 0;            
+         }
     }    
-    
-    if(!modBusMaster1::pacoteEmEspera){
+    if(!modBusMaster1::pacoteEmEsperaValido){
         pc.printf("Erro de CRC.\n");
+        modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote
+        modBusMaster1::index = 0; 
         return 255;    
     }
+//-----------------Bloco de tentativas---------------------            
         
     modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote
     modBusMaster1::index = 0;
@@ -455,38 +543,60 @@
     uint16_t crc;
     uint8_t result;
     
-    modBusMaster1::buffer[0]=enderecoSlave;
-    modBusMaster1::buffer[1]=16;
-    modBusMaster1::buffer[2]=registrador>>8;
-    modBusMaster1::buffer[3]=(registrador & 0xFF);
-    modBusMaster1::buffer[4]=qtdRegistros>>8;
-    modBusMaster1::buffer[5]=(qtdRegistros & 0xFF);
-    modBusMaster1::buffer[6]=qtdRegistros*4;       
-    
-    for(i=0;i<qtdRegistros;i++){
-        modBusMaster1::buffer[(i*4)+7]=(var[i]>>24)&0xFF;
-        modBusMaster1::buffer[(i*4)+8]=(var[i]>>16)&0xFF;
-        modBusMaster1::buffer[(i*4)+9]=(var[i]>>8)&0xFF;
-        modBusMaster1::buffer[(i*4)+10]=var[i]&0xFF;
-    }
+//-----------------Bloco de tentativas---------------------    
+    uint16_t retentativas = maxRetentativas+1;
+    uint16_t delayEntreTentativas = maxDelayEntreTentativas;
+    while(retentativas){
+//------------Bloco de construcao de frame request----------        
     
-    crc=modBusMaster1::CRC16(modBusMaster1::buffer,((qtdRegistros)*4)+7);
-    
-    modBusMaster1::buffer[(qtdRegistros*4)+7]=crc>>8;;
-    modBusMaster1::buffer[(qtdRegistros*4)+8]=(crc & 0xFF);
-    
-    
+        modBusMaster1::buffer[0]=enderecoSlave;
+        modBusMaster1::buffer[1]=16;
+        modBusMaster1::buffer[2]=registrador>>8;
+        modBusMaster1::buffer[3]=(registrador & 0xFF);
+        modBusMaster1::buffer[4]=qtdRegistros>>8;
+        modBusMaster1::buffer[5]=(qtdRegistros & 0xFF);
+        modBusMaster1::buffer[6]=qtdRegistros*4;       
+        
+        for(i=0;i<qtdRegistros;i++){
+            modBusMaster1::buffer[(i*4)+7]=(var[i]>>24)&0xFF;
+            modBusMaster1::buffer[(i*4)+8]=(var[i]>>16)&0xFF;
+            modBusMaster1::buffer[(i*4)+9]=(var[i]>>8)&0xFF;
+            modBusMaster1::buffer[(i*4)+10]=var[i]&0xFF;
+        }
+        
+        crc=modBusMaster1::CRC16(modBusMaster1::buffer,((qtdRegistros)*4)+7);
+        
+        modBusMaster1::buffer[(qtdRegistros*4)+7]=crc>>8;;
+        modBusMaster1::buffer[(qtdRegistros*4)+8]=(crc & 0xFF);
     
-    //Enviando frame
-    if(!modBusMaster1::sendFrame((qtdRegistros*4)+9)){
-        pc.printf("Erro de timeout.\n");
-        return 254;   
+//------------Bloco de construcao de frame request----------    
+        if(!modBusMaster1::sendFrame((qtdRegistros*4)+9)){
+            osDelay(delayEntreTentativas);
+            retentativas--;
+            if(debug){
+                //DEBUG Mostrando o que é enviado via modbus
+                pc.printf("Retentativa de comando modbus.\r\n");
+            }
+            if(retentativas==0){
+                //erro de timeout certamente
+                pc.printf("Erro de timeout.\n");
+                modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote
+                modBusMaster1::index = 0; 
+                return 254;                
+            }            
+        }else{
+            //Chegou pacote, vamos ver se é valido
+            retentativas = 0;            
+         }
     }    
-    
-    if(!modBusMaster1::pacoteEmEspera){
+    if(!modBusMaster1::pacoteEmEsperaValido){
         pc.printf("Erro de CRC.\n");
+        modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote
+        modBusMaster1::index = 0; 
         return 255;    
     }
+//-----------------Bloco de tentativas---------------------        
+    
         
     modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote
     modBusMaster1::index = 0;
@@ -513,40 +623,61 @@
     uint16_t i;
     uint16_t crc;
     uint8_t result;
-    
-    modBusMaster1::buffer[0]=enderecoSlave;
-    modBusMaster1::buffer[1]=16;
-    modBusMaster1::buffer[2]=registrador>>8;
-    modBusMaster1::buffer[3]=(registrador & 0xFF);
-    modBusMaster1::buffer[4]=qtdRegistros>>8;
-    modBusMaster1::buffer[5]=(qtdRegistros & 0xFF);
-    modBusMaster1::buffer[6]=qtdRegistros*4;       
-    
-    for(i=0;i<qtdRegistros;i++){
-        u.v = var[i];
-        modBusMaster1::buffer[(i*4)+7]=u.c[3];
-        modBusMaster1::buffer[(i*4)+8]=u.c[2];
-        modBusMaster1::buffer[(i*4)+9]=u.c[1];
-        modBusMaster1::buffer[(i*4)+10]=u.c[0];
-    }
-    
-    crc=modBusMaster1::CRC16(modBusMaster1::buffer,((qtdRegistros)*4)+7);
-    
-    modBusMaster1::buffer[(qtdRegistros*4)+7]=crc>>8;;
-    modBusMaster1::buffer[(qtdRegistros*4)+8]=(crc & 0xFF);
-    
-    
-    
-    //Enviando frame
-    if(!modBusMaster1::sendFrame((qtdRegistros*4)+9)){
-        pc.printf("Erro de timeout.\n");
-        return 254;   
+//-----------------Bloco de tentativas---------------------    
+    uint16_t retentativas = maxRetentativas+1;
+    uint16_t delayEntreTentativas = maxDelayEntreTentativas;
+    while(retentativas){
+//------------Bloco de construcao de frame request----------    
+        
+        modBusMaster1::buffer[0]=enderecoSlave;
+        modBusMaster1::buffer[1]=16;
+        modBusMaster1::buffer[2]=registrador>>8;
+        modBusMaster1::buffer[3]=(registrador & 0xFF);
+        modBusMaster1::buffer[4]=qtdRegistros>>8;
+        modBusMaster1::buffer[5]=(qtdRegistros & 0xFF);
+        modBusMaster1::buffer[6]=qtdRegistros*4;       
+        
+        for(i=0;i<qtdRegistros;i++){
+            u.v = var[i];
+            modBusMaster1::buffer[(i*4)+7]=u.c[3];
+            modBusMaster1::buffer[(i*4)+8]=u.c[2];
+            modBusMaster1::buffer[(i*4)+9]=u.c[1];
+            modBusMaster1::buffer[(i*4)+10]=u.c[0];
+        }
+        
+        crc=modBusMaster1::CRC16(modBusMaster1::buffer,((qtdRegistros)*4)+7);
+        
+        modBusMaster1::buffer[(qtdRegistros*4)+7]=crc>>8;;
+        modBusMaster1::buffer[(qtdRegistros*4)+8]=(crc & 0xFF);
+
+//------------Bloco de construcao de frame request----------    
+        if(!modBusMaster1::sendFrame((qtdRegistros*4)+9)){
+            osDelay(delayEntreTentativas);
+            retentativas--;
+            if(debug){
+                //DEBUG Mostrando o que é enviado via modbus
+                pc.printf("Retentativa de comando modbus.\r\n");
+            }
+            if(retentativas==0){
+                //erro de timeout certamente
+                pc.printf("Erro de timeout.\n");
+                modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote
+                modBusMaster1::index = 0; 
+                return 254;                
+            }            
+        }else{
+            //Chegou pacote, vamos ver se é valido
+            retentativas = 0;            
+         }
     }    
-    
-    if(!modBusMaster1::pacoteEmEspera){
+    if(!modBusMaster1::pacoteEmEsperaValido){
         pc.printf("Erro de CRC.\n");
+        modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote
+        modBusMaster1::index = 0; 
         return 255;    
     }
+//-----------------Bloco de tentativas---------------------            
+
         
     modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote
     modBusMaster1::index = 0;
@@ -578,47 +709,52 @@
     for(i=0;i<qtdRegistros;i++){
         var[i]=0.0;
     }
+
+//-----------------Bloco de tentativas---------------------    
+    uint16_t retentativas = maxRetentativas+1;
+    uint16_t delayEntreTentativas = maxDelayEntreTentativas;
+    while(retentativas){
+//------------Bloco de construcao de frame request----------           
        
-    modBusMaster1::buffer[0]=enderecoSlave;
-    modBusMaster1::buffer[1]=funcao;
-    modBusMaster1::buffer[2]=registrador>>8;
-    modBusMaster1::buffer[3]=(registrador & 0xFF);
-    modBusMaster1::buffer[4]=qtdRegistros>>8;
-    modBusMaster1::buffer[5]=(qtdRegistros & 0xFF);
-    
-    crc=modBusMaster1::CRC16(modBusMaster1::buffer,6);
+        modBusMaster1::buffer[0]=enderecoSlave;
+        modBusMaster1::buffer[1]=funcao;
+        modBusMaster1::buffer[2]=registrador>>8;
+        modBusMaster1::buffer[3]=(registrador & 0xFF);
+        modBusMaster1::buffer[4]=qtdRegistros>>8;
+        modBusMaster1::buffer[5]=(qtdRegistros & 0xFF);
+        
+        crc=modBusMaster1::CRC16(modBusMaster1::buffer,6);
+        
+        modBusMaster1::buffer[6]=crc>>8;
+        modBusMaster1::buffer[7]=(crc & 0xFF);       
     
-    modBusMaster1::buffer[6]=crc>>8;
-    modBusMaster1::buffer[7]=(crc & 0xFF);       
-    
-
-        
-    if(!modBusMaster1::sendFrame(8)){
-        pc.printf("Erro de timeout.\n");
-        return 254;   
+//------------Bloco de construcao de frame request----------    
+        if(!modBusMaster1::sendFrame(8)){
+            osDelay(delayEntreTentativas);
+            retentativas--;
+            if(debug){
+                //DEBUG Mostrando o que é enviado via modbus
+                pc.printf("Retentativa de comando modbus.\r\n");
+            }
+            if(retentativas==0){
+                //erro de timeout certamente
+                pc.printf("Erro de timeout.\n");
+                modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote
+                modBusMaster1::index = 0; 
+                return 254;                
+            }            
+        }else{
+            //Chegou pacote, vamos ver se é valido
+            retentativas = 0;            
+         }
     }    
-    
-    if(!modBusMaster1::pacoteEmEspera){
+    if(!modBusMaster1::pacoteEmEsperaValido){
         pc.printf("Erro de CRC.\n");
+        modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote
+        modBusMaster1::index = 0; 
         return 255;    
     }
-    
-    
-    /*
-    for(i=3;i<modBusMaster1::index-2;i++){    
-        u.c[3-(i-3)]= modBusMaster1::buffer[i];
-    }
-        
-    *var = u.f;
-    */
-    
-    
-    /*pc.printf("Lido pacote de modBus <0x");
-    
-    for(i=0;i<modBusMaster1::index;i++){
-        pc.printf("%02x ",modBusMaster1::buffer[i]);        
-    }
-    pc.printf(">.\n");*/
+//-----------------Bloco de tentativas---------------------    
     
     if(modBusMaster1::buffer[1]&(0x1<<7)){        
         result = modBusMaster1::buffer[2];