Prévia do material em texto
PROTOCOLO CRC – Mostrador Digital
• CMD – Comando enviado para painel
• NFR – Número do Frame
• NFRAME – Número de Frames do pacote
• TAM_DATA – Número de dados a serem transmitidos
Input Dados (Comando 0x80): Exemplo de painel com 8 dígitos.
01 02 50 01 01 DB 01 01 80 01 01 00 08 31 32 33 34 35 36 37 38 03 6A AB
Cabeçalho:
01 – SOH
02 – STX
50 – CLASSE DA ORIGEM
01 – GRUPO DA ORIGEM
01 – ID DA ORIGEM
DB – CLASSE DO DESTINO (MOSTRADOR DIGITAL)
01 – GRUPO DO DESTINO
01 – ID DO DESTINO (ID do Painel – Configuração feita pela DipSwitch na CPU do
Painel)
80 – COMANDO INPUT DADOS
01 – NÚMERO DO FRAME NO PACOTE
01 – NÚMERO DE FRAMES EXISTENTES NO PACOTE
00 08 – TAMANHO DOS DADOS A SEREM TRANSMITIDOS (HEX)
Dados:
31 – ‘1’ (ASC)
32 – ‘2’ (ASC)
33 – ‘3’ (ASC)
SOH STX
CLAS.
ORIG.
GROUP
ORIG.
ID
ORIG.
CLAS.
DEST.
GROUP
DEST.
ID
DEST. CMD NFR NFRAME TAM_DATA DATA ETX CRC
01
byte
01
byte 01byte 01 byte
01
byte
01
byte 01 byte
01
byte
01
byte
01
byte 01 byte 02 byte
n
bytes
01
byte
02
bytes
01h 02h 03h
34 – ‘4’ (ASC)
35 – ‘5’ (ASC)
36 – ‘6’ (ASC)
37 – ‘7’ (ASC)
38 – ‘8’ (ASC)
03 – ETX
6A AB – CRC - CHECKSUN
OBS: O Exemplo acima coloca os seguintes valores nos campos:
Campo 01 – Valor 12345678.
*Alterando o valor enviado, basta aumentar ou diminuir
o número de dados transmitidos.
Configuração das Dip’s
Dip 1 – OFF : Protocolo CRC / ON: Protocolo BCC
Dip 2 – OFF : Não Pisca / ON: Pisca ao receber novo valor
Dip 3 e Dip 4 – Tempo de Acionamento Relé e Beep.
OFF – OFF: 3 segundos
OFF – ON: 5 segundos
ON – OFF: 7 segundos
ON – ON: 9 segundos
Dip 5, Dip 6, Dip 7 e Dip 8: Configuração do ID do Painel (Dip 8 menos
significativa).
Cálculo do CRC16 em Linguagem C:
//===============================================================
//
// CÁLCULO DO VALOR CRC16
// RESULTADO: Valor CRC16 (16 Bits)
//
//===============================================================
short CRC_Calc(unsigned char *Char_Addr,unsigned short Char_Qtdy)
{
unsigned short CRC16 = 0xFFFF; // Buffer para valor CRC16 calculado
unsigned short Char_to_CRC; // Buffer para operar caracteres durante cálculo CRC16
unsigned char Bit_Counter; // Contador de bits do caracter a adicionar ao cálculo CRC16
unsigned char Polin_Flag; // Flag para sinalizar se necessário calcular com Polinômio
const unsigned short Polynom = 0x1021; // Polinômio para cálculo do valor CRC16
while (Char_Qtdy != 0) // Enquanto não processados todos os caracteres previstos
{
Bit_Counter = 8; // Contador de bits de cada caracter a ser processado
Char_to_CRC = (*Char_Addr * 256); // Prepara caracter do Buffer para cálculo
CRC16 = (CRC16 ^ Char_to_CRC); // CRC16 = (Valor atual CRC16 EXOR'ed com caracterdo Buffer
while (Bit_Counter != 0) // Enquanto não processados todos os bits do caracter atual
{
if (CRC16 > 32767) // Se bit 15 do CRC atual = 1
{
Polin_Flag = 1; // Sinaliza necessária operação com o POLINÔMIO PADRÃO
}
else
{
Polin_Flag = 0; // Sinaliza desnecessário operação com o POLINÔMIO PADRÃO
}
CRC16 = (CRC16 * 2); // Shift Left valor CRC16 atual
if (Polin_Flag != 0) // Se bit 15 do CRC atual = 1
{
CRC16 = (CRC16 ^ Polynom); // ExOR valor CRC16 atual e polinômio padrão
}
Bit_Counter--; // Decrementa contador de bits do caracter atual
}
Char_Addr++ ; // Prepara ponteiro para o próximo caracter a processar
Char_Qtdy-- ; // Decrementa contador de caracteres a processar
}
return CRC16;
}