Page 1 of 1

bCommNotify Problem

PostPosted: Tue Jan 28, 2014 12:42 pm
by MGA
Sr. Antonio,

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. :)

Re: bCommNotify Problem

PostPosted: Tue Jan 28, 2014 2:30 pm
by Antonio Linares
Como llegas a la conclusión de que se llama dos veces ?

Tienes algún log de error ?

Re: bCommNotify Problem

PostPosted: Tue Jan 28, 2014 3:36 pm
by MGA
Senhor Antonio,

O código de barras chega dividido, ex:

7894900111002

1 evento: 78949001
2 evento: 11002

Antes chegava normal.

Re: bCommNotify Problem

PostPosted: Wed Jan 29, 2014 8:00 pm
by MGA
UP!

Re: bCommNotify Problem

PostPosted: Wed Jan 29, 2014 10:10 pm
by Antonio Linares
Que versión de Harbour y FWH usas ahora y cual usabas antes ?

Cuando dices en dos eventos, te refieres a que el resultado correcto es ambos, asi ?

1 evento: 78949001 + 2 evento: 11002

Re: bCommNotify Problem

PostPosted: Thu Jan 30, 2014 10:02 am
by MGA
FWH1308 XHARBOUR 1.2.1 (6406)

Esperava receber o código de barras: 7894900111002

poderia vir todo o código de uma vez.

ou

poderia vir em pedaços, mais no mesmo evento.

Mais parece q BCOMMNOTIFY chama duas vezes CheckSerial() e não apenas uma.

ex:
na primeira: checkserial() 78949001
na segunda: checkserial() 11002