PDA

Ver la versión completa : [VB][C#] - Aplicacion de polinomio CRC16




araxhiel
02-24-2010, 11:08 AM
Buen día! Primeramente, debo comentar que, de no estar este tema en el lugar apropiado... :p ahí disculpen... y pues nada mas hagan el comentario de donde donde va :rolleyes:

Bueno, la cosa esta así (dejen primero les platico el por que de mi problema para que me entiendan un poquito):

En mi trabajo estamos desarrollando un sistema de automatización para determinado equipo de uso industrial el cual pues, para no entrar en detalles (por que si no me cortan los hu....esos de las manos :eek:) requiere que los datos sean enviados en formato Hexadecimal por medio de una conexión RS485 (serial), el detalle radica en que, junto con los datos que se le envían al dispositivo, deben de ir 'adjuntado' el CRC de dichos datos.

Hasta ahí no hay problema, la generación de las cadenas hexadecimales, la concatenacion de los diversos datos, etc... el mayor problema radica en la generación de el CRC, ya que, según el manual del mugrero ese (el dispositivo), deben de salir 2 bytes en hexadecimal (y, viendo como le explican en ese documento, tienen que salir POR FUERZA 2 bytes SIN IMPORTAR que tan larga sea la cadena a enviar).

Ahora bien, el polinomio que se emplea es el CRC de 16 bits conocido como X25 estándar (polinomio generador: x16 + x12 + x5 + 1). Y es justamente ahí donde me pierdo.

La cuestión por la que me pierdo es que, al no tener ni las mas mínima idea de como aplicar de manera correcta el polinomio, pues recurrir a realizar una búsqueda en la red para ver si alguien tenia si no un manual/tutorial/que-se-yo (o guia para idiotas como yo) algun snippet o recurso el cual usar. Afortunadamente (según como se vea) encontré en CodeProject un proyecto de generación de CRC por Marcel de Wijs (http://www.codeproject.com/KB/cs/marcelcrcencoding.aspx?df=100&forumid=29803&exp=0&select=1726104) y también encontré el proyecto del classless-hasher (http://code.google.com/p/classless-hasher/) (no si alguien de aquí ya tuviera conocimiento de ambos recursos). Pero "Oh! Desilusión!", al momento de aplicar ambas soluciones (en momentos diferentes, para evitar confusiones), me lleve con la sorpresa de que me generaban un CRC muy diferente al esperado (mas de 2 bytes y tomando en base la cadena de ejemplo en el manual del dispositivo, me daban resultados completamente erróneos).

Después de hacer tremendo coraje, volví al buscador para tratar de localizar algo que me pudiera ser de utilidad (o ya de plano un conversor de C a C# (o a VB, C++, o en estos momentos a lo que sea...) ya que en el manual hay un código en C para generar el CRC pero... no le se al C :(), con tal, encontré esto (CRC library by Lammertbies (http://www.lammertbies.nl/comm/software/index.html)) el cual pues es una librería (con todo y ejecutable) que, afortunadamente (de nuevo, depende de como se vea), SI me genera los valores correctos de CRC para la cadena de ejemplo, pero, de nuevo, el codigo esta en ANSI C/C++ (creo que es C puro) y pues no tengo ni la mas mínima idea...

Ahora bien, ya después de mi desahogo emocional/laboral y de establecer los antecedentes a mi problema, la pregunta que hago es mas que obvia:

Viendo mi situación, ¿alguien tiene/conoce algún recurso o guia o algo que me pueda ayudar? o ya de plano, ¿como convierto código C a C#/VB.NET? (para adaptar el código de la librería del Lammerbies) ya que si alguien tiene experiencia usando el código de Marcel o el Classless, pues no se... podrían darme ahí una pequeña explicación de como lograr modificar los parámetros para que me de el resultado "correcto" de acuerdo a la especificación del dispositivo.

Ya por ultimo, agrego una captura de texto, de la aplicación del Lammerbies mostrando los datos de ejemplo y cual es el resultado correcto:

CRC algorithm sample program
Lammert Bies, Version 1.16

Input: 1002070001 <-- Valor ejemplo
"" :
CRC16 = 0x7AB0 / 31408
CRC16 (Modbus) = 0x7A94 / 31380
CRC16 (Sick) = 0x0D87 / 3463
CRC-CCITT (0x0000) = 0x7C83 / 31875 <-- Valor Correcto (A este método en el sitio también le llaman CRC-CCITT (XModem)
CRC-CCITT (0xffff) = 0x6D8F / 28047
CRC-CCITT (0x1d0f) = 0x8D4D / 36173
CRC-CCITT (Kermit) = 0xBA10 / 47632
CRC-DNP = 0xB2E7 / 45799
CRC32 = 0x7E838E07 / 2122550791

De antemano gracias por su atención y paciencia... Saludos!