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