Estamos trabajando en la comunicación entre el AVR y un Crous PTZ.
Hemos encontrado el protocolo y ahora podemos encenderla y así.
Tenemos problema con su CRC. Este es Crous protocolo doc (lo Tengo aquí), al final de la misma, el CRC algoritmo se describe (ver imagen de abajo), pero parece que está mal porque el contador parámetro nunca va a ser 8 pero se comprueba para ver si es de 8 o no.
Nuestro codificador ha escribí el siguiente código para el algoritmo , pero regresó el CRC no es el mismo que el CRC devuelto por Crous dispositivo.
#include <stdint.h>
unsigned int crc_chk(unsigned char dta, unsigned char length)
{
int16_t j;
uint16_t a,b,c;
uint16_t reg_crc=0x0000;
for( c = 0; c < length; c++ )
{
a = reg_crc / 256;
a ^= test_crc[dta];
dta++;
a *= 256;
b = reg_crc&0xff;
reg_crc = a | b;
for( j = 0; j < 8; j++ )
{
if ( reg_crc & 0x8000 )
reg_crc = ( reg_crc * 2 ) ^ 0X8005; /* LSB(b0)=1 */
else
reg_crc = reg_crc * 2;
}
}
return reg_crc; // the value that sent back to the CRC register finally
}
Él encontró la verdadera CRC en el dispositivo responde, por ejemplo , En este dispositivo responder
01 BF 15 0F 94 95 96 97 9F 9E A2 A0 98 99 72 6B 6A 88 89 64 62 63 65 66 03 2D AC
y según la página 45 del protocolo de Doc, el CRC de
0F 94 95 96 97 9F 9E A2 A0 98 99 72 6B 6A 88 89 64 62 63 65 66
debe ser 2DAC, 03 muestra final de los datos, y el 15 es el tamaño de los datos que, cuando se calcula que en decimal, serán 21 que ver, tenemos 21 bytes.
¿Cuál es la forma correcta de este algoritmo?