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,