Kalay   30-11-2021, 18:23
#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.
AlfredoSC   01-12-2021, 04:35
#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:

Código:
Com1.Begin()
Print #Com1, s
Com1.Send()
Wait 0.002
Y así puedo enviar la variable s, con sus diferentes valores mientras sea String.

Haz la prueba y nos comentas.

Saludos
Última modificación: 01-12-2021, 04:36 por AlfredoSC.

Es mejor saber un poco de todo, que todo de muy poco. Lo primero, garantiza la supervivencia humana.
Kalay   01-12-2021, 10:24
#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.
  
Usuarios navegando en este tema: 4 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.