Se detiene despues de la primera vez...

Se detiene despues de la primera vez...

Postby jllinas » Wed Jun 11, 2008 10:06 pm

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 view
#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
jllinas
 
Posts: 189
Joined: Fri Oct 14, 2005 12:33 am
Location: Santo Domingo, Dominican Republic

Postby cmsoft » Wed Jun 11, 2008 11:14 pm

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
cmsoft
 
Posts: 1189
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Postby jllinas » Thu Jun 12, 2008 2:45 am

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
User avatar
jllinas
 
Posts: 189
Joined: Fri Oct 14, 2005 12:33 am
Location: Santo Domingo, Dominican Republic

Postby vlmsoft » Thu Jun 12, 2008 12:55 pm

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.
vlmsoft
 
Posts: 36
Joined: Thu Jun 28, 2007 3:43 pm
Location: Madrid


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 71 guests