Este foro usa cookies
Este foro utiliza cookies para almacenar su información de inicio de sesión si está registrado y su última visita si no lo está. Las cookies son pequeños documentos de texto almacenados en su computadora; las cookies establecidas por este foro solo se pueden usar en este sitio web y no representan ningún riesgo de seguridad. Las cookies en este foro también rastrean los temas específicos que ha leído y la última vez que los leyó. Si Ud. continúa navegando, entenderemos que acepta todas las cookies.

Se almacenará una cookie en su navegador, independientemente de la elección, para evitar que se le vuelva a hacer esta pregunta. Podrá cambiar la configuración de sus cookies en cualquier momento utilizando el enlace en el pie de página.

El foro antiguo se encuentra accesible desde https://foro.gambas-es.org en modo de solo lectura.

Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5

Retardo al enviar/recibir por puerto serie
#1

Hola a todos!

He heredado una aplicación hecha en Gambas y me estoy introduciendo en el mundillo. 
esta aplicación comunica con varios periféricos a través de RS-485. En PC tiene un conversor RS-485 a RS-232 (no va por USB). Los periféricos actúan como slaves (sólo responden a las preguntas del PC). La cosa es que entre una trama y otra, tengo un delay de 50ms. Si pongo trazas en el código, veo que en el mismo milisegundo que recibo la respuesta de una trama, se envía la siguiente, pero si conecto el osciloscopio, entre la trama de respuesta y la siguiente pregunta tengo un tiempo de reposo de 50ms.

Es decir, según trazas en el código tengo los siguientes tiempos:
000ms: se envía trama de pregunta
055ms: se acaba de enviar la trama de pregunta
110ms: se empieza a recibir primeros bytes de trama de respuesta
150ms: se acaba de recibir la trama de respuesta
150ms: se envía trama de pregunta 2

Según el osciloscopio los tiempos son:
000ms: empieza trama de pregunta
040ms: acaba la trama de pregunta
050ms: empieza de trama de respuesta
090ms: acaba la trama de respuesta
150ms:  empieza trama de pregunta

En el envío ya hay una diferencia de 15ms entre lo que tarda en enviar y el tiempo real de transmisión de la trama, pero entre que acaba la trama de respuesta y empieza la siguiente pregunta, hay un vacío de 50ms aprox.

Para enviar lo hago así:
Código:
 
    _serial.Begin()
    Write #_serial, s
    _serial.Send()
    Flush #_serial

Para recibir, he probado por polling o por interrupción y los tiempos no cambian.

La aplicación funciona sobre Debian 9.

¿Alguna idea de donde puedo estar perdiendo estos 50ms y como corregirlo?

Gracias.
    ¡Gracias!
#2

(30-11-2021, 18:23)Kalay escribió:  hay un vacío de 50ms aprox.

Hola:

Es posible que no se requiera enviar el comando Flush, puesto que Send ya envía todo lo que hay en el buffer. El manual de gambas3 dice, para Send():

Send all the data, in one shot, since the last call to Begin.

Así que ese Flush
dedica 50 ms en enviar un buffer vacío, el cual seguramente es de 256 bytes al menos.

En mi caso yo siempre uso solamente:

GAMBAS
  1. Com1.Begin()
  2. Print #Com1, s
  3. Com1.Send()
  4. Wait 0.002


Y así puedo enviar la variable s, con sus diferentes valores mientras sea String.

Haz la prueba y nos comentas.

Saludos

Es mejor saber un poco de todo, que todo de muy poco. Lo primero, garantiza la supervivencia humana.
[-] Los siguientes 1 usuarios dice gracias a AlfredoSC por este post:
  • Kalay
    ¡Gracias!
#3

Hola Alfredo SC.
Gracias por la respuesta.

Inicialmente lo tenía sin flush, pero si no hago el flush, el código
Código:
    _serial.Begin()
    Write #_serial, s
    _serial.Send()
tardaba 0ms en ejecutarse. Supongo la función sólo Send() le indica que empiece a hacer la transmisión, pero no espera a que realmente se haya enviado la trama, en cambio con el flush, espera a que se haya enviado.
El resto del comportamiento no cambiaba, los tiempos eran los mismos.
    ¡Gracias!


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)