Autor Tema: [VB][C#] - Aplicacion de polinomio CRC16  (Leído 1496 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado araxhiel

  • Leecher
  • *
  • Mensajes: 1
  • Sexo: Masculino
  • Ka is like the wind...
    • Liebe, Hass, Leben und Tod
[VB][C#] - Aplicacion de polinomio CRC16
« : 27/02/2010, 10:27:27 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  ???

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  :o) 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 You are not allowed to view links. Register or Login y también encontré el proyecto del You are not allowed to view links. Register or Login (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é You are not allowed to view links. Register or Login) 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

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!
No apunto con la mano; aquél que apunta con la mano ha olvidado el rostro de su padre. Apunto con el ojo.

No disparo con la mano; aquél que dispara con la mano ha olvidado el rostro de su padre. Disparo con la mente

No mato con mi pistola; aquél que mata con la pistola ha olvidado el rostro de su padre. Mato con el corazón.

Desconectado azuloro85

  • Leecher
  • *
  • Mensajes: 1
Re:[VB][C#] - Aplicacion de polinomio CRC16
« Respuesta #1 : 24/09/2011, 05:25:50 pm »
HOLAA AMIGOO ME ACABO DE REGISTRAR Y VI TU MENSAJE, CREO QUE MI RESPUESTA ES ALGO TARDIA, PERO YO TENGO LA SOLUCION A LO QUE ANDAS BUSCANDO TENGO EL CRC IMPLRMENTADO EN JAVA Y ES EL QUE NECESITAS, SI AUN LO NECESITAS, TE LO PASO CON TODO GUSTO, SALUDOS