percebi um comportamento diferente do METHOD:
METHOD CommNotify( nDevice, nStatus ) CLASS TWindow
Ao ler um código de barras por um leitor serial, parece que o methodo esta chamando dois EVENTOS e não um como nas versões anteriores.
(FONTE1) Exemplo de código com problema:
#include "FiveWin.ch"
static oWnd, nCom
//----------------------------------------------------------------------------//
function Main()
DEFINE WINDOW oWnd TITLE "Serial Test"
ACTIVATE WINDOW oWnd maximized on init(Serial())
IF nCom >= 0; CLOSECOMM( nCom ); ENDIF
return nil
//----------------------------------------------------------------------------//
static function CheckSerial()
local cRetorno:=space(200), nBytesRead
FlushComm( nCom, 0 )
SysWait( 0.4 )
nBytesRead := ReadComm( nCom, @cRetorno )
? cRetorno
return nil
/**********************************************************/
static function Serial()
LOCAL cDcb
BEGIN SEQUENCE
nCom := OPENCOMM( "COM1", 16384, 16384 )
IF nCom < 0
BREAK
ENDIF
BUILDCOMMDCB( "COM1:9600,N,8,1", @cDcb )
IF !SETCOMMSTATE( nCom, cDcb )
BREAK
ENDIF
EnableCommNotification( nCom, oWnd:hWnd, 1, -1 )
oWnd:bCommNotify = { | nCom | CheckSerial()}
RECOVER
nCom = -1
END SEQUENCE
RETURN
(FONTE2) Exemplo de código adaptado para poder funcionar corretamente:
#include "FiveWin.ch"
static oWnd, oTmr, nCom
//----------------------------------------------------------------------------//
function Main()
DEFINE WINDOW oWnd TITLE "Serial Test"
DEFINE TIMER oTmr INTERVAL 1000 ACTION CheckSerial() OF oWnd
ACTIVATE WINDOW oWnd maximized on init(oTmr:Deactivate(),Serial())
IF nCom >= 0; CLOSECOMM( nCom ); ENDIF
return nil
//----------------------------------------------------------------------------//
static function CheckSerial()
local cRetorno:=space(200), nBytesRead
oTmr:DEACTIVATE()
FlushComm( nCom, 0 )
SysWait( 0.4 )
nBytesRead := ReadComm( nCom, @cRetorno )
? cRetorno
return nil
/**********************************************************/
static function Serial()
LOCAL cDcb
BEGIN SEQUENCE
nCom := OPENCOMM( "COM1", 16384, 16384 )
IF nCom < 0
BREAK
ENDIF
BUILDCOMMDCB( "COM1:9600,N,8,1", @cDcb )
IF !SETCOMMSTATE( nCom, cDcb )
BREAK
ENDIF
EnableCommNotification( nCom, oWnd:hWnd, 1, -1 )
oWnd:bCommNotify = { | nCom | otmr:activate() }
RECOVER
nCom = -1
END SEQUENCE
RETURN
Quando CheckSerial() é chamado da BCOMMNOTIFY(FONTE1) parece que dois eventos são disparados.
Quando CheckSerial() é chamado diretamente(FONTE2) apenas um evento é disparado.