Página 1 de 1

Modbus pé de chinelo e endereçamento de coils!

MensagemEnviado: 01 Fev 2011 14:29
por cortex
tenho um modibus bem barrelo rodando num LPC 1768, apenas respondendo em 6 hold registers com um simulador mestre que tenho aqui, estou tentando acionar 8 saidas sendo uma cada coil, o que não estou conseguindo é ler o byte da requisição para endereçar os coils! alguem tem alguma idéia de como ler e armazenar byte a byte para fazer a comparação e responder para o mestre? se é que meu raciocínio está correto??????

MensagemEnviado: 02 Fev 2011 12:10
por leoabubauru
Não sei se entendi sua dúvida, mas...

Se você já conseguiu retirar a mensagem recebida no registrador RX do uC, monte um buffer em faça um AND com o valor do bit desejado num IF

Código: Selecionar todos
if (BufferRX[POSICAO_DO_BYTE_COMANDO] & 8) // Bit 8 está setado?
    {
    faz alguma coisa
    }



Se ainda não conseguiu montar o buffer da mensagem recebida no RX, leia o datasheet sobre quais registradores devem ser configurados / lidos e, depois, faça o algoritmo acima.

MensagemEnviado: 02 Fev 2011 14:49
por cortex
Fala leo blz!

estão to fazendo o seguinte:


char rx_char[8];

rx_char[LPC_UART0->RBR] = LPC_UART0->RBR;

sendo o "LPC_UART0->RBR" o registrador de recebimento da serial

isso seria um buffer?


ai faço minha condição:
if( rx_char[LPC_UART0->RBR]& 0x05) {

}

funciona, mas responde em outros pedidos tbm! to bem perdido nos bytes aqui!!

MensagemEnviado: 02 Fev 2011 16:26
por polesapart
cortex escreveu:
char rx_char[8];

rx_char[LPC_UART0->RBR] = LPC_UART0->RBR;



Caramba, isso sim é buffer overflow :P

MensagemEnviado: 03 Fev 2011 07:05
por cortex
Sou bem fraco em "C"!

não entendo como fazer pra colocar cada byte em cada posição do meu bufer!

MensagemEnviado: 03 Fev 2011 12:50
por leoabubauru
Hummmm!

Bem, comece gerando uma interrupção do canal RX e armazenando o registrador de RX numa matriz (ou vetor, ou o que prefirir chamar)

Código: Selecionar todos
#define TAMANHO_BUFFER 8
#define POSICAO_DO_BYTE_COMANDO x (substituir x pelo número que representa a posição do byte que contém o comando)

char rx_char[8];
static char BufferCounter = 0;

/* Rotina de interrupção de RX */
void int_UART_RX()
{
    rx_char[BufferCounter] = LPC_UART0->RBR;
    BufferCounter++;
   
    if (BufferCounter >= TAMANHO_BUFFER)
        {
        BufferCounter = 0;
        }
}




Depois você usa o byte referente ao comando em outra parte do seu código.


Código: Selecionar todos
if (rx_char[POSICAO_DO_BYTE_COMANDO] & 0x08) // Bit 4 está setado (0000 1000 = 0x08)?
    {
    faz alguma coisa
    }




Este é um exemplo simplista. Comece a escrever o código. Teste-o. Depois faça uma rotina para tratar erros como, por exemplo, zerar a variável BufferCounter se o buffer tem um CRC errado.

MensagemEnviado: 03 Fev 2011 16:28
por cortex
ae leo eu tava batendo na trave velho! sou bem fraquin em "C" vou fazendo meio que no chutômetro, peguei tua explicação e tava parecida com o que eu estava fazendo! fiz uns ajustes e funcionou legal! agora é só desenvolver!

valeu! abraço!!!! :D