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

data;
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)];

% A transmissão da mensagem de solicitação é repetida sempre que um erro
% ocorra
status=0;
tries=0;
maxtries=10;
while (status==0 && tries<=maxtries)
    
    pause(0.001);
    
    % Incremento da tentativa
    tries=tries+1;
    
    % Envio da mensagem de pedido
    n=0;
    msg=message;
    while (length(msg)>0)
        n=cportwrite(H,msg);
        if (n<0), continue, end
        msg=msg(n+1:end);
    end

    % Procura pelo primeiro byte
%     rx=[];
%     i=0;
%     status=0;
%     while (status==0 && i<=maxtries*2)
%         i=i+1;
%         [rx0,status]=cportgetint(H,1,1);
%         if (status==1 && uint8(intunsigned(rx0,8))<MESSAGE_MINTYPE), status=0; end
%     end
%     % Se a recepção falhou, voltar a tentar a transmissão
%     if (status==0), continue, end

    pause(0.001);

    % Recepção de um array de bytes
    [rx,status]=cportgetint(H,1,USART_RECV_LENGTH+1+extra);
    %rx=[rx0; rx];
    % Se a recepção falhou, voltar a tentar a transmissã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
    status=((rx(1)==MESSAGE_SUCESS || rx(1)==MESSAGE_INVREQ) && bcc_err==0);
    
    % Se metade das tentativas foram usadas, limpar buffers
    if (tries==ceil(maxtries/2)), cportreset(H); end
end

% if (tries>1)
%     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(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(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