Hola comunidad de todopic, un saludo para todos y espero que estén bien.
Paso a comentar el problema inicial para el cual necesito ayuda.
Tenemos en el laboratorio dos equipos que se comunican por puerto serial de la siguiente forma:
Llamemos al equipo solicitante Equipo_A, éste equipo recibe por otro medio (Lan), paquetes de información firmados. Entonces requiere que otro equipo le indique la cadena String de comprobación (CRC) que le indica que el paquete es válido.
Ejemplo: Equipo_A: Solicita comprobación del paquete con cadena string 'STF32554S', el Equipo_B recibe esa cadena y se conecta a un servidor para obtener el CRC, que seria por ejemplo '7TREWQ899'.
Hasta aquí todo bien, el inconveniente que tenemos es que el Equipo_B, a veces responde con cadenas nulas, vacías o con las cadenas CRC pegadas (dobles o triples), lo que hace que el Aquipo_A se bloquee, ya que solo puede recibir cadenas CRC de 9 caracteres.
Nuestra solución fue colocar un PC (Con dos puertos COM) en medio de los dos equipos y crear un programa en VB6 que filtre esas CRC y solo deje pasar las de 9 caracteres. Para cuando le llegan longitudes dobles o triples, tome los últimos 9 caracteres y los envie. Adicionalmente guarde la última cadena CRC válida transmitida y la repita, si llega una cadena nula, una cadena inferior a 9 mucho mas grande que el triple.
El programa es muy sencillo, pero no podemos tener un PC permanentemente en el sitio, por cuestiones de espacio y energía.
Alguien nos sugirió que como el programa es sencillo, lo hicieramos en un PIC y así solucionariamos todo (espacio, energia, uso de PC).
Solo tenemos conocimeinto de armado d circuitos pero no de programacion para PIC.
Por eso solicito a quien pueda colaborarme, modificando el código de vb6 a PIC.
Colocamos un commandButton, dos timers y dos MSComm
Option Explicit
Private sDatoA As Variant
Private Sub Command1_Click()
Timer1.Interval = 500
Timer1.Enabled = True
Timer2.Interval = 500
Timer2.Enabled = True
End Sub
Private Sub Form_Load()
With MSComm1
.CommPort = 1
.Settings = "115200,n,8,1"
.PortOpen = True
End With
With MSComm2
.CommPort = 3
.Settings = "115200,n,8,1"
.PortOpen = True
End With
End Sub
Private Sub Timer1_Timer()
MSComm2.Output = MSComm1.Input 'Le enviamos al servidor la solicitud del Equipo_A
End Sub
Private Sub Timer2_Timer()
filtrakey MSComm2.Input 'Llega una CRC
End Sub
Private Sub filtrakey(ByVal CRCKey As Variant)
Dim pKey1 As Variant
Dim pKeym As Variant
Dim pKey2 As Variant
If Len(CRCKey) = 57 Then 'Cuando llegan pegadas tres CRC de longitud válida
pKey2 = Right(CRCKey, 19) 'CRC de la parte derecha
'Las CRC que venian pegadas son iguales
If sDatoA <> pKey2 Then 'La CRC de la derecha es igual a la izquierda comparo cualquiera
MSComm1.Output = pKey2 'Enviamos la CRC que llega al Equipo_A
sDatoA = pKey2 'Guardo la CRC
End If
End If
If Len(CRCKey) = 38 Then 'Cuando llegan pegadas dos CRC de longitud válida
pKey2 = Right(CRCKey, 19) 'CRC de la parte derecha
If sDatoA <> pKey2 Then 'La CRC de la derecha es igual a la izquierda comparo cualquiera
MSComm1.Output = pKey2 'Enviamos la CRC que llega al Equipo_A
sDatoA = pKey2 'Guardo la CRC
End If
End If
If Len(CRCKey) = 19 Then 'Llega una CRC de longitud válida
pKey1 = CRCKey 'Guardo la CRC para comparar
If sDatoA <> pKey1 Then 'La key que llega es diferente de la anterior
MSComm1.Output = pKey1 'Enviamos la CRC que llega al Equipo_A
sDatoA = pKey1 'Guardo la nueva CRC
End If
End If
'Cuando no llega ningun CRC correcto entonces repetimos el anterior,
'intentando que no se bloquee
If (sDatoA <> "") And (Len(CRCKey) <> 19) Then 'Ya hay un CRC anterior correcto y el que llega tiene longitud incorrecta
MSComm1.Output = sDatoA 'Enviamos el CRC anterior
End If
End Sub
Les agradezco cualquier colaboración, Nosotros compramos un MASM 232 y un PIC 16F628A, pero no sabemos y nos sirvan.