Programa de cálculo típico de CRC-16 en Quick Basic
crcsum# = &HFFFF&
crcshift# = &H0&
crcconst# = &HA001&
CLS
PRINT "******************************************************"
PRINT
PRINT "
Calculador de CRC-16
PRINT
PRINT "******************************************************"
PRINT "
Si ingresa datos en hexadecimal, procede los datos con '&H'"
PRINT "
Ejemplo: 32 decimal = 20 hex = &H20"
PRINT "******************************************************"
PRINT
INPUT "Ingrese el numero de bytes en el mensaje: ", maxbyte
FOR bytenum = 1 TO maxbyte STEP 1
PRINT "Ingrese byte"; bytenum; ":":
INPUT byte&
Byte& = byte& AND &HFF&
crcsum# = (crcsum# XOR byte7) AND &HFFFF&
FOR shift = 1 TO 8 STEP 1
crcshift# = (INT (crcsum# / 2)) AND &H7FFF&
IF crcsum# AND &H1& THEN
crcsum# = crcshift# XOR crcconst#
ELSE
crcsum# = crcshift#
END IF
NEXT shift
NEXT bytenum
inferior& = crcsum# AND &HFF&
superior& = (INT(crcsum# / 256)) AND &HFF&
PRINT "byte inferior (1º) = ", HEX$(inferior&)
PRINT "byte superior (2º) = ", HEX$(superior&)
Programa de cálculo de CRC-16 en C
//*buf
Indicador del arreglo de caracteres que contienen los caracteres usados para calcular CRC
//bufLen
numero de caracteres para calcular CRC
//*crc
Indicador del arreglo que contiene el CRC calculado
void getMBCRC (char *buf, int bufLen, char *crc) {
unsigned long crc_0 = 0xffff;
unsigned long crc_1 = 0x0000;
int i,j;
for (i=0;i<bufLen; i++) {
crc_0^= ((unsigned long)buf[i] & 0x0ff);
for (j=0;j<8;j++) {
}
crc[0] = (unsigned char) ((crc_0/256) & 0x00ff);
crc[1] = (unsigned char) (crc_0 & 0x00ff);
return;
Mensaje sin respuesta
El Inversor desatiende el comando de mensaje y no devuelve un mensaje de respuesta en los siguientes casos.
1. En una simultanea transmisión de datos (dirección de esclavo es 0), todos los esclavos ejecutan pero no
responden.
2. Cuando un error de comunicación (desborde, formato, paridad, o CRC-16) es detectado en el comando de
mensaje.
3. Cuando la dirección del esclavo del comando de mensaje no coincide con la dirección configurada en el
esclavo.
4. Cuando el largo de los datos del comando de mensaje no es el apropiado.
"
crc_1 = (crc_0>>1) & 0x7fff;
if (crc_0 & 0x0001)
crc_0 = (crc_1^0xa001);
else
crc_0 = crc_1;
}
}
Comunicaciones D-
//Declaración e inicialización de variables
//Lazo a través de los caracteres del arreglo de entrada
// XOR carácter actual con 0x00ff
//Lazo por los bits de caracteres
//Mueve el resultado, un lugar a la derecha y lo almacena
//Si el valor es previamente movido el bit 0 es configurado
//XOR el valor movido con 0xa001
// Si el valor es previamente movido el bit 0 no es configurado
//Configura el valor previamente movido igual al valor movido
//Byte superior
//Byte inferior
7