Cálculo del CRC de 16 bits en Matlab
Publicado por Sigmar (3 intervenciones) el 23/05/2011 18:40:47
Buenas,
mi problema es que debo calcular el CRC de 16 bits de una trama. He utilizado todos los codigos que hay en MathWorks (crc9,crc16,etc) con el polinomio exacto (0x1021) y no me da el CRC correcto. Éste lo compruebo mediante esta web: http://www.lammertbies.nl/comm/info/crc-calculation.html
Donde el CRC que corresponde con el de mi sistema es el CRC-CCITT (XModem).
Dado que estos codigos no funcionan, he optado por coger las funciones que calculan el CRC en C y probar de leerlas en Matlab mediante mexFunction, pero no termino de apañarmelas puesto que me hago un lío con las variables de salida y entrada. El codigo en C que pretendo leer con Matlab es este:
donde introduzco mi trama como un vector en binario data, y len es su longitud.
Me sirve cualquier cosa, tanto un codigo que me calcule bien el CRC que necesito o el código C para matlab.
A ver si hay suerte y alguien se ha encontrado con esto, grácias.
mi problema es que debo calcular el CRC de 16 bits de una trama. He utilizado todos los codigos que hay en MathWorks (crc9,crc16,etc) con el polinomio exacto (0x1021) y no me da el CRC correcto. Éste lo compruebo mediante esta web: http://www.lammertbies.nl/comm/info/crc-calculation.html
Donde el CRC que corresponde con el de mi sistema es el CRC-CCITT (XModem).
Dado que estos codigos no funcionan, he optado por coger las funciones que calculan el CRC en C y probar de leerlas en Matlab mediante mexFunction, pero no termino de apañarmelas puesto que me hago un lío con las variables de salida y entrada. El codigo en C que pretendo leer con Matlab es este:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
static uint16_t crc_byte(uint16_t crc, uint8_t b)
{
uint8_t i;
crc = crc ^ b << 8;
i = 8;
do
if (crc & 0x8000)
crc = crc << 1 ^ 0x1021;
else
crc = crc << 1;
while (--i);
return crc;
}
static uint16_t crc_packet(uint8_t *data, int len)
{
uint16_t crc = 0;
while (len-- > 0)
crc = crc_byte(crc, *data++);
return crc;
}
donde introduzco mi trama como un vector en binario data, y len es su longitud.
Me sirve cualquier cosa, tanto un codigo que me calcule bien el CRC que necesito o el código C para matlab.
A ver si hay suerte y alguien se ha encontrado con esto, grácias.
Valora esta pregunta


0