Estamos trabajando en la comunicación entre AVR y un Crous PTZ.
Encontramos su protocolo y ahora podemos activarlo y así.
Tenemos problemas con su CRC. Este es el protocolo de Crous doc (Lo tengo here ), al final, se describe el algoritmo CRC (ver imagen abajo), pero parece está mal porque el parámetro del contador nunca será 8, pero se verifica para ver si es 8 o no.
Nuestro codificador ha escrito el siguiente código para ese algoritmo, pero el CRC devuelto no es el mismo que el CRC devuelto por el dispositivo Crous.
#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
}
Encontró que el verdadero CRC en el dispositivo responde, por ejemplo, En este dispositivo responda
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 de acuerdo con la página 45 de The protocol Doc, CRC of
0F 94 95 96 97 9F 9E A2 A0 98 99 72 6B 6A 88 89 64 62 63 65 66
debería ser 2DAC, 03 muestra el final de los datos, y 15 es el tamaño de los datos que, cuando lo calculamos en decimal, será 21 que usted ve que también tenemos 21 bytes.
¿Cuál es la forma correcta de este algoritmo?