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

 

2 Replies to “FCS Frame Check Secuence – CRC Cyclic Redundancy Check algorithm”

  1. I drop a comment whenever I like a post on a site or I have something to add
    to the discussion. It is caused by the fire communicated in the post I browsed.
    And after this article FCS Frame Check Secuence – CRC Cyclic Redundancy Check algorithm – PepLluis.
    I was actually moved enough to drop a comment 🙂 I actually do have 2 questions for you if it’s allright.

    Could it be simply me or do a few of these remarks appear as if
    they are left by brain dead visitors? 😛 And, if you
    are posting at additional online sites, I would like to keep up with everything new you have to post.

    Would you list all of all your public sites like your
    twitter feed, Facebook page or linkedin profile?

Leave a Reply

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.