Sobre el manejo de archivos...

jmasso
03 de Mayo del 2005
Saludos a todos!

Tengo un gran problema, y es realmente urgente; y espero que me puedan ayudar.

Estoy desarrollando una aplicación, que usa el puerto serial para comunicarme con un equipo de medición de fibra óptica. Para ello, empleo el MSComm y me funciona sin problemas, puedo enviarle comandos al equipo y este me responde y hace x o y función, hasta alli sin problemas.

Ese equipo de medición es un OTDR (un equipo que realiza reflectometrías); el punto es que ese equipo es capaz de guardar archivos de las cosas que hace (la reflectometría). Estos archivos están regidos por un estandar (Telcordia Bellcore), en fin... como se darán cuenta ese archivo está estructurado.

El punto, es que el equipo me manda el archivo; pero en los extremos del mismo introduce ciertos datos, algo así como para comprobar que ha llegado correctamente. Les explico más o menos de que se trata.

El archivo que me manda el equipo tiene la siguiente estructura:

#520056[a partir de este corchete está el bloque de bits definidos por el estándar y termina el bloque en el siguiente corchete]<END>vbCrVblf

#: Representa algo así como un inicio de trama.

El segundo caracter (para el ejemplo mostrado 5); me representa el número de digitos que debo leer a continuación; como se verá, a despues del 5, está 20056 que está compuesto por cinco digitos.

Ese número, el 20056 (en este caso de 5 digitos); me representa el número el número de bytes de datos que siguen; y que en sí dan inicio al bloque definido por el estándar (inicio del corchete)

Una vez leidos estos 20056 bytes de datos (fin del corchete), vienen los caracteres <END> y un retorno de carro y un avance de línea.

Lo que necesito hacer es almacenar unicamente estos 20056 bytes de datos en un archivo, que debo crear y cuya extención debe ser .sor

Quizás mi instrucción no fue lo más precisa posible, así que les pego las instrucciones que están en el manual del equipo.

How to Upload a Bellcore File from the current trace

1. Upload the file from the OTDR
Send the query MMEM:LOAD:FILE? "xxxxxxx.sor"

2. Read in the first character
This character should be a hash (#).

3. Read in the next character
This character should be an integer, m, giving the number of digits you should now read.

4. Read in the next m characters
This series of characters should form an integer, n, giving the number of data bytes that follow.

5. Read in the next n data bytes, and store them.
6. Read until the final <END>.


Todo eso, lo he tratado de traducir a VB6.0, y he hecho esto:

sPrimerCaracter = Left(Rxbuffer, 1) 'Leo el primer caracter de lo que recibi del equipo
Rxbuffer = Right(Rxbuffer, Len(Rxbuffer) - 1) 'Elimino el primer carácter de la cadena, ya que no me interesa

iSegundoCaracter = Left(Rxbuffer, 1) 'Leo el segundo caracter que me representa cuantos digitos debo leer a continuación
Rxbuffer = Right(Rxbuffer, Len(Rxbuffer) - 1) 'Borro el segundo caracter de la cadena

iNumeroDeBytesALeer = Left(Rxbuffer, iSegundoCaracter) 'Leo el número de bytes de datos, por el que debera está compuesto del archivo
Rxbuffer = Right(Rxbuffer, Len(Rxbuffer) - iSegundoCaracter) 'Elimino esos dígitos de la trama, para que únicamente me quede "el inicio del corchete"
Rxbuffer = Left(Rxbuffer, iNumeroDeBytesALeer) 'Leo los bytes que se especificaron de la cadena.

Open sArchivo For Output As #1 'Creo un archivo donde se van a guardas esos datos
Print #1, Rxbuffer,;
Close #1


El resto de la información del buffer no me interesa; teoricamente todo lo hace perfectamente y de hecho es así, pero el archivo nunca llega a abrir; es decir, el programa asociado a ese tipo de datos me dice que no se puede abrir, que no la reconoce.

Ahora bien, ese equipo tiene la posibilidad de guardar esos archivos en un disquete; por ende, lo que hago es comparar, que fué lo que guardó en el el disquette y que es lo que yo estoy recibiendo en la PC, el resultado, a nivel estructural del archivo es el mismo, es decir, los archivos son iguales; la diferencia es que uno lo abre y otro no :(

Las conclusiones que he podido obtener de este problema son las siguientes y las preguntas que me he formulado son las siguientes:

1. Debido a que el tipo de datos que envia/recibe el MsComm son Variant, quizas la estructura de dicho formato de datos este alterando algo.
(es algo irracional esa deducción, pero bueno, igual la he pensado). La pregunta sería, como almacenar lo que me está entrando al puerto en una variable tipo byte? es posible eso?

2. ¿Es correcta la forma en la cual estoy almacenando los datos en el archivo?, No lo sé, a la final, el archivo que voy a guardar está comprendido por una serie de caracteres "extraños", pero en fin, lo que me interesan son los bytes de el archivo; el programa que interpreta esos archivos se encargará de descifrarlo.

3. Conocen alguna instrucción que sea capaz de reconocer dentro de una cadena de bytes, la presencia de el <END>?, lo digo, para guardar el archivo hasta que se inicie esa cadena.

4. La forma de crear el archivo es la correcta?, lo pregunto porque el print, se que "edita" los bytes, en caso de que reconozca alguna estructura de datos definida.

5. He usado el acceso binario a archivos, pero al inicio de la escritura, me coloca caracteres en el archivo que no deben estar ya que de lo contrario no se abre el archivo. ¿Existe alguna forma de evitar que se coloquen estos caracteres antes de que se coloque lo que está en la variable que quiero almacenar?

Open sArchivo For Binary As #2
Put #2, , Rxbuffer
Close #2

7. Según MSDN, para trabajar un archivo en modo binario recomiendan usar una matriz cuyos typos de datos, sean unicamente binarios, la pregunta es, como introducir una cadena de caracteres, bytes y esas cosas en una matriz de bytes?. Lo he intentado por todos los medios, y me da el error de que son tipos de datos diferentes. Alguna idea?

y por ultimo... pueden ayudarme? sugerencias, opiniones, comentarios... todos seran bien recibidos.

Saludos desde Venezuela!
José Manuel



mvallejos
03 de Mayo del 2005
José Manuel

Yo me inclino por la opciòn 5, ya que si como decìs, son datos estructurados, siempre es la misma cantidad de bytes la que recibìs del puerto.
Si eso tiene caracteres no deseables, puedes usar la funciòn Replace para eliminarlos antes de escribir.
Rxbuffer = Replace(Rxbuffer,CaracterEliminar,"")
Ahora, si lo de estructurado lo dices por el formato con que arma un paquete de datos pero los datos son una cadena de texto, eso es otra cosa, ya que los datos no son Variant, posiblemente los estès capturando en una variable de tipo variant que es distinto.

espero que sirva de algo

Saludos desde Argentina