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
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?
You can reach me in Linkedin