FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Lectura de tramas: <SYN><DLE><STX> ... <DLE><ETX>
Hola,
Estoy realizando una aplicación que lee datos del puerto serie. Los datos que me llegan los almaceno en un buffer de recepción de bytes. Este buffer tiene la siguiente estructura:
Las tramas que me llegan tienen el siguiente formato: <SYN><DLE><STX> ... <DLE><ETX> Mi problema es que soy capaz de leer tramas, pero con mi forma de hacerlo parece ser que alguna se me escapa. Tiene alguien algún método para leer tramas de ese tipo??? Muchas gracias... |
#2
|
||||
|
||||
Cita:
Esperamos tu retroalimentación. Saludos. Al. |
#3
|
|||
|
|||
A continuación pongo el código con el que leo las tramas. El buffer que utilizo es un buffer circular. Uso un componente llamado TVaComm para usar el puerto serie. Cuando recibo un carácter por el puerto serie se produce el evento en el que compruebo si tengo una trama completa. El código es el siguiente:
Lo que hago primero es tomar los bytes del puerto serie y meterlos en el buffer de recepción. A continuación compruebo si hay una trama completa y si la hay la desempaqueto. Quizás no sea la forma más práctica ni ortodoxa, pero más o menos me funciona jeje Muchas gracias... |
#4
|
|||
|
|||
Cita:
Para este tipo de menesteres y desde mi experiencia con la recepción de paquetes de datos a través de puerto serial, te recomiendo que uses el componente TurboPower Async Professional (gracias amigo Al por recomendarmelo hace ya unos años ), el cual tiene dentro de sus particularidades un objeto de nombre ApdDataPacket, a este objeto le asignas una cadena de inicio y una cadena de final por ejemplo: En las propiedades del Objeto ApdDataPacket StartString = #22 [SYN] (Aunque yo usaria solo #2 [STX], a menos que requieras por fuerza el [SYN]) EndString = #3 [ETX]; y en código solo requieres hacer esto:
Al final, te olvidas de codificar y validar cada vez que recibes un caracter. Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney |
#5
|
|||
|
|||
Gracias por tu ayuda Egostar... pero... pero...
El componente que uso es el TVaComm. Este viene junto con otra serie de componentes en un paquete llamado Async32 si no me equivoco. Otro de los componentes que trae es el TVaCapture que funciona como tu dices. Le indicas el comienzo y el fin de trama y cuando detecta ese comienzo y fin produce un evento que tiene como parámetro el contenido del paquete. El problema que me encontré es que el modem que uso devuelve los caracteres hexadecimales y el componente TVaCapture devuelve caracteres ASCII. En principio para algunas cosas me es igual, pero me he dado cuenta de un pequeño fallo. Resulta que el modem devuelve en muchas tramas el valor $00 (carácter NULL) y TVaCapture lo devuelve en el String de datos como un espacio en blanco ($20 si no me equivoco). Entonces esto a veces me lleva a error xq puede que alguna vez sí sea verdaderamente un espacio o a veces sea un NULL. Y estos valores puede que me sean necesarios saber el valor exacto. No sé si después de todo este palabrerío se me habrá entendido jeje. De todas formas... muchísimas gracias por el consejo!!! |
#6
|
||||
|
||||
Cita:
Saludos. Al. |
#7
|
|||
|
|||
Cita:
Muchas gracias otra vez a los dos!!! |
#8
|
|||
|
|||
Cita:
Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney |
#9
|
|||
|
|||
Gracias por tomarte la molestia de realizar un código para la lectura del puerto serie. Una pequeña pega que le veo es que la variable linea debería ser global y no local, ya que puede que no lleguen todos los caracteres de la trama en el momento en que se produzca el evento. Quizás llegue en dos veces por lo que la variable se habrá vuelto a inicializar y supongo que no funcionará, no?
Salu2... |
#10
|
|||
|
|||
Cita:
Si y no, ya que al ser una comunicación serial, los caracteres te llegan como su nombre lo indica, de forma serial, uno tras otro, por lo que el conflicto que mencionas no creo que se presente ya que cuando te llega el primer caracter de la siguiente trama, inicializas la variable Linea. La puse como local para que se viera, pero puedes hacerla global. Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney |
#11
|
|||
|
|||
Hola de nuevo,
Cita:
<STX>Esto es un ejemplo de una cadena por el puerto serie<ETX> puede que la primera vez que se genera el evento llegue tan sólo: <STX>Esto es un ejemplo de una cadena esto tu lo almacenas en lína y a continuación te llega el resto de trama: por el puerto serie<ETX> Esto te llega la segunda vez que se genera el evento por lo que la variable línea se habrá vuelto a inicializar y no tendrá la trama completa por lo que se perdería. Si no me equivoco este es el comportamiento del puerto serie, aunque para decir la verdad es ahora cuando lo estoy manejando por primera vez. Para evitar que se pierdan tramas lo que usaba yo es un buffer circular. Un saludo egostar & cia... |
#12
|
|||
|
|||
Cita:
Tu vas a recibir solo un SYN o si quieres un STX identificando que es una cadena nueva (yo prefiero usar STX, porque en un protocolo de este tipo la cadena valida esta siempre entre STX y ETX), es por eso que solo la incializamos cuando recibimos ese caracter, cuando sea cualquier otro estamos agregando los caracteres a Linea, y solo hasta que nos llegue ETX hacemos el proceso correspondiente de una cadena completa. Edito: No importa cuantas veces nos mande caracteres para completar una sola trama completa Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney Última edición por egostar fecha: 08-05-2008 a las 21:36:29. |
#13
|
|||
|
|||
Cita:
|
#14
|
|||
|
|||
Cita:
Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney |
#15
|
|||
|
|||
Hola compañeros,
Tengo otro problema con el puerto serie y es debido a un overflow de los buffers que usa el componente TVaComm. Si empiezo a enviar cosas por el puerto serie puede que llegue un momento en el que desborde el buffer de transmisión (en recepción puede pasar lo mismo lógicamente, aunque ahora me preocupa más el de transmisión). Si os ha pasado esto alguna vez, ¿podríais darme alguna pista de como lo habeis solucionado?. Muchas gracias... |
#16
|
||||
|
||||
Cita:
|
#17
|
|||
|
|||
Cita:
Puedes bajar los archivos de ayuda que tienen disponibles. tpapro_docs Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney |
#18
|
||||
|
||||
ok gracias les echare un vistazo
|
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Lectura del USB por Interrupción | cisco | Varios | 0 | 25-10-2007 19:13:29 |
Documentacion para Generar Tramas TCP | bastardo10 | Varios | 0 | 07-06-2007 18:31:38 |
Lectura de un FTP con idHTTP | gluglu | Internet | 2 | 05-05-2007 01:35:50 |
Problema de lectura de un cd | dragondetierra | Varios | 0 | 18-02-2007 19:58:52 |
|