Se detiene despues de la primera vez...

Post Reply
User avatar
jllinas
Posts: 189
Joined: Fri Oct 14, 2005 12:33 am
Location: Santo Domingo, Dominican Republic
Contact:

Se detiene despues de la primera vez...

Post by jllinas »

Hola a todos,

A ver si me traen luz, pues está un poco oscuro.

Tengo un receptor de mensajes de varias estaciones remotas. Las estaciones remotas transmiten via radio, automaticamente, mensajes de caracteres que debo interpretar y almacenar. El receptor (hardware) cuenta con un puerto serial (9600, 8 N, 1) que puedo "escuchar". Cada mensaje está separado con una linea en blanco, o sea, una secuencia de dos CRLF.

He tomado uno de los ejemplos de SAMPLES y lo modifiqué como sigue:

Code: Select all | Expand

#include "FiveWin.ch"

static nComm

// --------------------------------------------- //

function Main()

   local oDlg, oIni, cComm

   FIN_MSG   := CRLF + CRLF

   INI oIni FILE ".\TestCom4.ini"
      GET cComm  SECTION "main" ENTRY "cComm" OF oIni DEFAULT "COM1:9600,n,8,1"
   ENDINI

   DEFINE DIALOG oDlg TITLE "Testing Comm functions"

   oDlg:bCommNotify = { | nComm, nStatus | BytesAtPort( nComm, nStatus ) }

   ACTIVATE DIALOG oDlg ;
      ON INIT ( If(!InitCOMM( cComm ),;
                   (MsgAlert( "No se pudo establecer comunicacion", "Error" ),oDlg:End()),),;
                EnableCommNotification( nComm, oDlg:hWnd, 20, 20 ) ) ;
      VALID ( CloseComm( cComm ), .t. )

return nil

// --------------------------------------------- //
/* Abre el puerto de Comunicaciones */
function InitCOMM( cSetting )

   local cDcb, nError
   local nComm := OpenComm( LEFT( cSetting,4 ), 1024, 128 )

   ? cSetting

   if ! BuildCommDcb( cSetting, @cDcb )
      nError = GetCommError( nComm )
      MsgStop( "BuildCommDcb Error: " + Str( nError ),"Error" )
      return .F.
   endif

   if ! SetCommState( nComm, cDcb )
      nError = GetCommError( nComm )
      MsgInfo( "SetCommState Error: " + Str( nError ) )
      return .F.
   endif

return .T.

// --------------------------------------------- //
/* Lee y muestra lo recibido por el puerto COM */
function BytesAtPort( nComm, nStatus )

   local cBuffer := Space( 1 )

   cMsg := ""
   DO WHILE .T.
     
      ReadComm( nComm, @cBuffer )
 
      cMsg += cBuffer
     
      IF LEN( cMsg ) >= 2 .and. RIGHT(cMsg, LEN( FIN_MSG )) = FIN_MSG
         Exit
      ENDIF

   ENDDO

   MsgInfo( Alltrim(cMsg), "Mensaje" )

return nil
// EOF - Testcom4.prg


Funciona MUY BIEN y RAPIDISIMO con el primer mensaje recibido, pero a partir de alli no se reciben mas mensajes y la ventana que abre dice "(not responding)", dejandome solo la opcion de abortar con Ctrl-Alt-Del.

¿Que no le he puesto a esto?
¿Es que una vez recibido cada mensaje debo hacer algo?
¿Me falta llamar a alguna función?

Ayuda, por favor....

Abrazos,
Julio Llinás
Visita mi Blog en http://mangucybernetico.blogspot.com/
xHarbour 1.1.0 + FWH810 + Borland 5.5.1
User avatar
cmsoft
Posts: 1297
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina
Been thanked: 2 times

Post by cmsoft »

Estimado jllinas:
Generalmente, las comunicaciones con los puertos seriales son del tipo
PC Enq Ack Ack Ack Eot
---------------------------------------------------------------
HOST Ack Datos Datos Eot
donde hay una comunicacion con envio de respuesta de datos recibidos (Ack) diciendo Ok, mandame mas datos. El host (cualquier maquina conectada a la PC por el puerto serial) espera que le den la orden de que puede mandar mas datos al puerto.
Ahora bien, esto depende fundamentalmente del dispositivo. Cada dispositivo tiene un protocolo de comunicacion establecido (que respuesta espera para cada envio) Eso tendrias que verlo en el manual del dispositivo.
No se si te ayuda de mucho esto, pero talvez te de alguna pista.
User avatar
jllinas
Posts: 189
Joined: Fri Oct 14, 2005 12:33 am
Location: Santo Domingo, Dominican Republic
Contact:

Post by jllinas »

Gracias cmsoft (creo que ese es tu nombre.... no?):

Consulté el manual como suguieres. La comunicación es en una sola direccion. El receptor tiene dos modos de funcionamientos: como DATA o como COMMAND. El último es para reconfigurarlo (cosa que no es el proposito en este momento), mientras que para el segundo, él dispositivo supone que existe un programa "escuchando" del otro lado por el puerto serial.

A ver otra cosa:

¿Para que sirve el comando FLUSHCOMM() ? ¿No tendre que llamarlo despues de recibir el primer mensaje?

Abrazos,
Julio Llinás
Visita mi Blog en http://mangucybernetico.blogspot.com/
xHarbour 1.1.0 + FWH810 + Borland 5.5.1
vlmsoft
Posts: 36
Joined: Thu Jun 28, 2007 3:43 pm
Location: Madrid

Post by vlmsoft »

Hola Julio,

Sirve para limpiar el buffer de envio/recepción de un puerto, eliminando todos los caracteres.

Esto es útil, por ejemplo, cuando queremos rechazar todos los caracteres que haya en el buffer para partir de cero antes de volver a enviar/recibir un mensaje.

Un saludo.
Post Reply