FCS Frame Check Secuence – CRC Cyclic Redundancy Check algorithm

En la mayoría de antiguos protocolos de comunicaciones “sobre todo Serie”, disponemos de algunos mecanismos para la detección y corrección de errores en el intercambio de tramas. En concreto hablando del puerto serie, a primer nivel disponemos del control de paridad con el que conseguimos descartar algunos de los errores de transmisión a nivel de byte, sin embargo muchos protocolos implementan un control a nivel de trama, en el que se realiza una suma de verificación de todos los bytes transmitidos. Esto es conocido como FCS o CRC que no deja de ser una referencia a un ‘checksum’ o verificación redundante. El resultado de la misma es añadido al final de la trama y enviado con el resto de datos. Una vez recibido por el terminal o dispositivo se efectuara la misma operación calculando de nuevo la FCS y comprobando que coincide con la transmitida… con ello conseguiremos tener un elevado porcentaje de confianza en tanto la integridad de los datos recibidos.


El cálculo puede presentarse más o menos complejo dependiendo de la implementación de esta verificación según el protocolo, aunque la mayoría de ellos se conforman con aplicar un simple ‘XOR’… veamos un ejemplo común:


   
    ‘ Calculo de la FCS de una trama
    ‘ Esta funcion devolvera el valor hexadecimal
    ‘ en forma de dos caracters ASCII

    Private Function Fcs(ByVal Trama As String) As String
        Dim MiFcs As Integer = 0
        For Each c In Trama
            MiFcs = Asc(c) Xor MiFcs
        Next
        Return Hex(MiFcs).ToString
    End Function


Para los amantes de bool… Recordemos la tabla para el ‘Or’ Exclusivo : MiFcs = Asc(c) Xor MiFcs


p

q

p ≠ q

Falso

Falso

Falso

Falso

Verdadero

Verdadero

Verdadero

Falso

Verdadero

Verdadero

Verdadero

Falso


Entonces solo nos faltara alinear los valores binarios del resultado anterior; efectuar el ‘Xor’ y continuar efectuando la misma operación hasta agotar el ultimo byte. Demostrar el tema de acarreos y resultados con 16/32 bits en hexadecimal lo dejamos para otro dia J o bién podeis continuar leyendo en : http://www.ietf.org/rfc/rfc2615.txt?number=2615 Por ahora me conformo pensando que :  Hex(MiFcs).ToString, soluciona mi problema. 


Resultado_Anterior

0

1

0

1

0

1

0

1

Byte_Actual

0

0

1

1

1

0

0

1

Resultado_Actual

0

1

1

0

1

1

0

0


Ya no os podéis quejar que con el avance de los lenguajes nos alejamos de los ‘Bites’.


Saludos,
Pep Lluis,


PD. EN VB6 Tenia este aspecto



‘ ** Calculo de la Fcs


‘ Al mas puro VB6



Private Function Fcs$(Var)


Dim p As Integer, q As Integer


 For p = 1 To Len(Var)


   q = q Xor Asc(Mid$(Var, p, 1))


 Next p


Fcs$ = Right$(“0″ + Hex$(q), 2)


End Function


 

Leave a Reply

Your email address will not be published. Required fields are marked *


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>