function [rx,err,errstr]=sendmessage(H,message)

% Load global data
data;
% Extra characters to read
extra=0;

% Validação dos argumentos
if (length(message)~=USART_SEND_LENGTH || message(1)~=MESSAGE_REQ)
    error('Mensagem a transmitir inválida!');
end

% Adicionar byte BCC
message=[message mod(sum(message),256)];

% Inicialização de variáveis
status=0;           % Estado erro inicial activado
tries=0;            % Número de tentativas
maxtries=10;        % Número máximo de tentativas

% Mensagem a transmitir
msg=uint8(message);

% A transmissão da mensagem de solicitação é repetida sempre que um erro
% ocorra
while (status==0 && tries<=maxtries)

    % Pausa de 1ms
    % Se houver problemas, descomentar em primeiro esta linha
    %pause(0.001);

    % Envio da mensagem de pedido
    n=cportwrite(H,msg);
    if (n>=0)
        msg=msg(n+1:end);
    end
    status=isempty(msg);

    % Verificando se a transmissão falhou
    if (status==0)
        tries=tries+1;
        cportreset(H);
        continue;
    end
    
    status=0;
    % Recepção da mensagem de resposta
    while (status==0 && tries<=maxtries)
    
        tries=tries+1;
        rx=[];
    
        % Pausa de 1ms
        % Se houver problemas, descomentar esta linha só depois da abaixo
        %pause(0.001);

        % Recepção de um array de bytes
        [rx,status]=cportgetint(H,1,USART_RECV_LENGTH+1+extra);
        
        % Se a recepção falhou, voltar a tentar a recepção
        if (status==0), continue, end

        % Ajuste da mensagem recebida
        rx = uint8(intunsigned(rx,8))';

        % Cálculo do BCC da mensagem recebida
        bcc=mod(sum(rx(1:end-1-extra)),256);
        % Comparando o BCC code da mensagem com o último byte
        bcc_err=(bcc~=rx(end-extra));
    
        % Status de sucesso de uma mensagem válida
        status = (rx(2)==message(2) && bcc_err==0);
        
        % Verificando se a mensagem de retorno é de erro
        % Em caso afirmativo, voltar a transmitir a mensagem de solicitação
        if (status==1 && rx(1)==MESSAGE_ERROR)
            msg=uint8(message);
            status=0;
            break;
        end
        
        % Finalização do cálculo do status
        status = (status && (rx(1)==MESSAGE_SUCESS || rx(1)==MESSAGE_INVREQ));
        
        % Se a recepção falhou, transmitir byte de erro
        if (status==0)
            % Se metade das tentativas foram usadas, limpar buffers
            cportreset(H);
            msg=uint8(MESSAGE_ERROR);
            break;
        end
    end
end

% if (tries>1)
%     tries
%      disp 'XXXXXXXXXXXXXXXXXXXXXX TRIES>1 XXXXXXXXXXXXXXXXXXXX'
% end

% Preparação da mensagem de saída
rx=rx(1:end-1-extra);

% Condições de erro
if (~isempty(msg) || isempty(rx))
    err=1;
else
    err=(rx(1)~=MESSAGE_SUCESS || bcc_err==1 || rx(2)~=message(2));
end

% Mensagem de erro
errstr='OK';
if (err)
    if (~isempty(msg))
        errstr='Mensagem de solicitação não transmitida!';
    elseif (isempty(rx))
        errstr='Impossivel obter resposta!';
    elseif (rx(1)==MESSAGE_INVREQ)
        errstr='Mensagem com parametros invalidos!';
    elseif (rx(1)==MESSAGE_WARNING)
        errstr='Mensagem de transmissão com erro de BCC!';
    elseif (rx(1)==MESSAGE_ERROR)
        errstr='Mensagem erroneamente recebida no Master!';
    elseif (bcc_err==1)
        errstr='Mensagem recebida com erro de BCC!';
    elseif (message(2)~=rx(2))
        errstr='Byte de tipo não coincidente!'
    else
        errstr='Erro desconhecido!';
    end
    
    % Reinicializar comunicações
    cportreset(H);
end