Page 1 of 1

codigo de barras serial (com1) ayuda urgente

Posted: Mon Dec 12, 2011 7:13 pm
by Andres Barillas
Un saludo al foro,, alguien tiene un programa lea un codigo de barras y se quede en el campo conforme a su cGet que tiene el control en la aplicacion como lo hace los lectores para teclado ya que es automatico. el lector que tengo es un symbol ls 5800 rs-232c serial y he probado ejemplos que hay en este foro para verificar la lectura pero no pasa nada.
Este ejemplo lo tome como referencia pero quiero que al leer el codigo de barra le dato o valor se quede en el cGet de mi dialogo.
Alguien que tenga algo hecho le agradecere que me apoye con su codigo.

Una mas!
utilizo la version fw24 con harbour y link con ajm aprovecho para preguntar que estoy pasando a la version fwh6 que se descarga aqui una aplicacion pero al usar el ajm me marca errores en las librerias mmm? cual es el problema.

****************
* bajado del Foro
****************
FUNCTION abrirport
LOCAL IdPort,cDcb,nError
IdPort := OpenComm("COM1",1024,1024)
IF IdPort <= 0
nError = GetCommError( IdPort)
MsgInfo( "Error al abrir: " + Str( nError ) )
ELSE
MsgRun("Puerto abierto como " + STR(IdPort))
ENDIF
IF ! BuildCommDcb("COM1"+":9600,e,8,1" , @cDcb)
nError = GetCommError( IdPort)
MsgInfo( "Error al Configurar: " + Str( nError ) )
RETURN 0
ELSE
MsgRun("Puerto Configurado")
ENDIF

IF ! SetCommState( IdPort, cDcb )
nError = GetCommError( IdPort)
MsgInfo( "Error al setear: " + Str( nError ) )
RETURN 0
ELSE
MsgRun("Puerto Seteado")
ENDIF

leer_bloque()

if ! CloseComm()
nError = GetCommError( "COM1" )
MsgInfo( "Error cerrando puerto: " + Str( nError ) )
endif

QUIT
RETURN IdPort

FUNCTION leer_bloque()
*-
for n = 1 to Len( cBuffer )
MsgInfo( Asc( SubStr( cBuffer, n, 1 ) ) )
next
*-
MsgInfo( "Proceda a leer ahora" )
nComm:= OpenComm("COM1" , 1024,128)
cBuffer:=Space(702)
nBytes := ReadComm (nComm,@cBuffer)

msginfo(cBuffer)
RETURN

Re: codigo de barras serial (com1) ayuda urgente

Posted: Tue Dec 13, 2011 9:24 am
by Robert Frank
Try

Code: Select all

Static Function MAIN_WINDOW()
Local hCOMM
DEFINE WINDOW oWnd ;
   TITLE "COM RECEIVE: "+DToC(Date()) ;
   MENU BuildMenu() ;
   MDI
SET MESSAGE OF oWND TO 'TEST COMM' 2007
hCOMM:=COM_OPEN(1)

oWND:bCommNotify := {|nComm,nStatus| ODBIERZ(hCOMM,nSTATUS) } // THIS IS MOST IMPORTANT LINE !!!!

ACTIVATE WINDOW oWnd ON Init (EnableCommNotification(hCOMM,oWNd:hWNd,1,-1)) VALID(COM_CLOSE(hCOMM))
Return (NIL)

Static Function BuildMenu()
   Local oMENU
MENU oMenu 2007
   MENUITEM "&End"   ACTION oWND:End()
ENDMENU
Return oMenu

Static Function ODBIERZ(hCOMM,nSTATUS)
   Local cZNAK:=Space(1)
   Local nBYTES

      nBYTES:=ReadComm(hCOMM,@cZNAK)

MsgInfo(cZNAK) // just one char , change to cZNAK:=Space(nLENGHTBARCODE)

Return .T.   

Function COM_OPEN(xPORT)
Local pNAME:=IIF(xPORT=1,"COM1","COM2")
Local hPORT
Local nError,cDCB
Local xRESZTA:=.T.
Local cSPEED:=":19200,N,8,1" // there are settings of my equipment, check your scanner for correct parameters


hPORT:= OpenComm( pNAME, 2048, 2048 )
If ! BuildCommDcb( pNAME+cSPEED, @cDcb )
    nError = GetCommError( hPORT )
         MsgInfo( "BuildCommDcb Error: " + Str( nError ) )
   xRESZTA:=.F.
EndIf
If ! SetCommState( hPORT, cDcb )
         nError = GetCommError( hPORT )
         MsgInfo( "SetCommState Error: " + Str( nError ) )
   xRESZTA:=.F.
EndIf
If xRESZTA
   oWND:oMSGBAR:cMSGDEF:=PNAME+" : OTWARTY"
   oWND:oMSGBAR:Refresh(.T.)
Else
   oWND:oMSGBAR:cMSGDEF:=PNAME+" : NIE UDANE OTWARCIE"
   oWND:oMSGBAR:Refresh(.T.)
EndIf
Return hPORT

Static Function COM_CLOSE(hPORT)
If ! CloseComm( hPORT )
      nError = GetCommError( hPORT )
      MsgInfo( "CloseComm Error: " + Str( nError ) )
EndIf
Return .T.

 

Re: codigo de barras serial (com1) ayuda urgente

Posted: Wed Dec 14, 2011 7:17 am
by Andres Barillas
Frank
Compilo el ejemplo y:

MAKE Version 5.2 Copyright (c) 1987, 2000 Borland
"C:\harbour\bin\HARBOUR.EXE" /iC:\harbour\include;C:\FW24\INCLUDE /n C:\aaPort\PtComm.PRG -o"C:\aaPort\PtComm.c"
xHarbour Compiler build 0.92.0 (SimpLex)
Copyright 1999-2003, http://www.xharbour.org http://www.harbour-project.org/
Compiling 'C:\aaPort\PtComm.PRG'...

C:\aaPort\PtComm.PRG(6) Error E0030 Syntax error: "parse error at 'WINDOW'"
C:\aaPort\PtComm.PRG(8) Error E0030 Syntax error: "parse error at 'MESSAGE'"
C:\aaPort\PtComm.PRG(13) Error E0030 Syntax error: "parse error at 'WINDOW'"
C:\aaPort\PtComm.PRG(18) Error E0030 Syntax error: "parse error at 'OMENU'"
C:\aaPort\PtComm.PRG(19) Error E0030 Syntax error: "parse error at 'MENUITEM'"
C:\aaPort\PtComm.PRG(20) Error E0020 Incomplete statement or unbalanced delimiters
6 errors
No code generated
** error 1 ** deleting "C:\aaPort\PtComm.c"

Que pasa?

static Function MAIN_WINDOW()
Local hCOMM
DEFINE WINDOW oWnd ;
TITLE "COM RECEIVE: "+DToC(Date()) ;
MENU BuildMenu() ;
MDI
SET MESSAGE OF oWND TO 'TEST COMM' 2007
hCOMM:=COM_OPEN(1)

oWND:bCommNotify := {|nComm,nStatus| ODBIERZ(hCOMM,nSTATUS) } // THIS IS MOST IMPORTANT LINE !!!!

ACTIVATE WINDOW oWnd ON Init (EnableCommNotification(hCOMM,oWNd:hWNd,1,-1)) VALID(COM_CLOSE(hCOMM))
Return (NIL)

Static Function BuildMenu()
Local oMENU
MENU oMenu 2007
MENUITEM "&End" ACTION oWND:End()
ENDMENU
Return oMenu

used Version Fw24 Ajm

Re: codigo de barras serial (com1) ayuda urgente

Posted: Wed Dec 14, 2011 10:59 pm
by Mike Serra
Hola, creo que falta

Code: Select all

#include "fivewin.ch"
 
Saludos

Re: Lectura serial error ? Help urgente

Posted: Thu Dec 15, 2011 6:58 am
by Andres Barillas
Mike
inclui l #Include "FiveWin.Ch" como me indicas y compilo y me da esto:

MAKE Version 5.2 Copyright (c) 1987, 2000 Borland
"C:\harbour\bin\HARBOUR.EXE" /iC:\harbour\include;C:\FW24\INCLUDE /n C:\aaPort\PtComm.PRG -o"C:\aaPort\PtComm.c"
xHarbour Compiler build 0.92.0 (SimpLex)
Copyright 1999-2003, http://www.xharbour.org http://www.harbour-project.org/
Compiling 'C:\aaPort\PtComm.PRG'...
C:\aaPort\PtComm.PRG(9) Error E0030 Syntax error: "parse error at 'WINDOWS'"
1 error
No code generated
** error 1 ** deleting "C:\aaPort\PtComm.c"

El codigo del programa donde marca el error:

#Include "FiveWin.Ch"
// Por Robert Frank

Static Function MAIN_WINDOW()
Local hCOMM

DEFINE WINDOWS oWnd ;
TITLE "COM RECEIVE: "+DToC(Date());
MENU BuildMenu() ;
MDI //-------------------------------------> Linea 9 con el Error

SET MESSAGE OF oWND TO 'TEST COMM'

hCOMM:=COM_OPEN(1)

oWND:bCommNotify := {|nComm,nStatus| ODBIERZ(hCOMM,nSTATUS) } // THIS IS MOST IMPORTANT LINE !!!!

ACTIVATE DIALOG oWnd ON Init (EnableCommNotification(hCOMM,oWNd:hWNd,1,-1)) VALID(COM_CLOSE(hCOMM))
Return (NIL)

La version que uso es FW24,BCC55 y compilo y linkeo con Ajm tiene que ver?

1. Leer (ReadComm->Robert Frank) por puerto serial(scanner) el codigo de barras y pasarlo al -> campo(aVar[26,2]t) validar
que exista en el Dbf y que muestre descripcion y precio
Redefine Get aVar[26,1] VAR aVar[26,2] ID 121 OF oDlg Picture replicate("!",30);
VALID IIF(ChecaProducto(aVar[26,2])=.t.,.T.,.F.) // Valida que exista en el DBF--> esto ya esta
// Checa en el Dbf y despliega Descripcion, Precio
2. Como incluir el procedimiento de Robert Frank en el campo Get aVar[26,1] VAR aVar[26,2] ?

3. Mi programa:
Define Dialog oDlg RESOURCE "Venta" TITLE pEmpresa
REDEFINE CHECKBOX oTranslate VAR lTranslate ID 116 OF oDlg VALID IIF(CHECKPTO(lTranslate)=.T.,.T.,.T.)

Redefine say aVar[6,1] PROMPT aVar[6,2] ID 114 OF oDlg UPDATE COLOR CLR_BLUE, CLR_GRAY // Fecha
Redefine Get aVar[3,1] VAR aVar[3,2] ID 104 OF oDlg PICTURE "99/99/99" COLOR CLR_BLACK, CLR_HGRAY // Fecha
Redefine Say aVar[4,1] PROMPT aVar[4,2] ID 105 OF oDlg PICTURE "99:99:99" COLOR CLR_BLUE, CLR_HGRAY // Hora
Redefine Say aVar[1,1] PROMPT aVar[1,2] ID 102 OF oDlg picture "999999" COLOR CLR_BLUE, CLR_HGRAY // No Folio
Redefine say aVar[22,1] PROMPT uNombre ID 118 OF oDlg COLOR CLR_BLUE, CLR_HGRAY // Nombre de Usuario
*- Aqui como definir el procedimiento de Robert Frank
Redefine Get aVar[26,1] VAR aVar[26,2] ID 121 OF oDlg Picture replicate("!",30); // Procedimiento --> ROBERT FRANK
VALID IIF(CHECAPRO(aVar[26,2])=.t.,.T.,.F.) COLOR CLR_BLACK, CLR_HGRAY
*-
Redefine Say aVar[7,1] PROMPT aVar[7,2] PICTURE "99999.999" ID 109 OF oDlg COLOR CLR_MAGENTA, CLR_HGRAY
// Precio
...
...
Activate Dialog oDlg CENTERED Valid if(GetASyncKey(VK_ESCAPE),.F.,.T.)

- No entiendo como FW24 se vincula o interactua el EVENTO de la lectura del scanner(ReadComm y lo demas....) con el control del Get " Get aVar[26,1] VAR aVar[26,2] "
Esto es nuevo para mi, espero su ayuda

Gracias Mike y Robert

Re: codigo de barras serial (com1) ayuda urgente

Posted: Thu Dec 15, 2011 12:30 pm
by Mike Serra
No lo he probado porque estoy en el trabajo pero creo que es un error del metacomando. :)

1º) Intenta reemplazar WINDOWS por WINDOW

si no te compila quita la linea 9 y el punto y coma de la anterior

Un Saludo,

Re: codigo de barras serial (com1) ayuda urgente

Posted: Thu Dec 15, 2011 10:22 pm
by Andres Barillas
Ok Mike Listo!, cambie Windows por Window como me indicaste y ya genero el exe.

Agradezco tu apoyo, como vez soy nuevo en esto; en si lo que pretendo es que en el campo de captura (cGet) cahe el codigo de barras leido por el scanner conectado por el puerto serial asi como lo hacen los scanner manuales o de pistola conectados al teclado o por USB.

El programa esta asi:
Define Dialog oDlg RESOURCE "Venta" TITLE pEmpresa

REDEFINE CHECKBOX oTranslate VAR lTranslate ID 116 OF oDlg VALID IIF(CHECKPTO(lTranslate)=.T.,.T.,.T.)
Redefine say aVar[6,1] PROMPT aVar[6,2] ID 114 OF oDlg UPDATE COLOR CLR_BLUE, CLR_GRAY // Fecha
Redefine Get aVar[3,1] VAR aVar[3,2] ID 104 OF oDlg PICTURE "99/99/99" COLOR CLR_BLACK, CLR_HGRAY // Fecha
Redefine Say aVar[4,1] PROMPT aVar[4,2] ID 105 OF oDlg PICTURE "99:99:99" COLOR CLR_BLUE, CLR_HGRAY // Hora
Redefine Say aVar[1,1] PROMPT aVar[1,2] ID 102 OF oDlg picture "999999" COLOR CLR_BLUE, CLR_HGRAY // No Folio
Redefine say aVar[22,1] PROMPT uNombre ID 118 OF oDlg COLOR CLR_BLUE, CLR_HGRAY // Nombre de Usuario

*- Aqui como se define el procedimiento de Robert Frank para el Get aVar[26,2] donde se quedara el codigo de barras

Redefine Get aVar[26,1] VAR aVar[26,2] ID 121 OF oDlg Picture replicate("!",30); // Procedimiento --> ROBERT FRANK
VALID IIF(CHECAPRO(aVar[26,2])=.t.,.T.,.F.) COLOR CLR_BLACK, CLR_HGRAY // valida que el producto que_
// exista y muestre descrip y precio
*-
Redefine Say aVar[7,1] PROMPT aVar[7,2] PICTURE "99999.999" ID 109 OF oDlg COLOR CLR_MAGENTA, CLR_HGRAY
// Precio
...
...
Activate Dialog oDlg CENTERED Valid if(GetASyncKey(VK_ESCAPE),.F.,.T.)


1. Leer (ReadComm->Robert Frank) por puerto serial(scanner) el codigo de barras y pasarlo al -> campo(aVar[26,2]t)
Redefine Get aVar[26,1] VAR aVar[26,2] ID 121 OF oDlg Picture replicate("!",30);
VALID IIF(ChecaProducto(aVar[26,2])=.t.,.T.,.F.) // Valida que exista en el DBF--> esto ya esta y
y despliega Descripcion, Precio

2. Como adecuar el procedimiento de Robert Frank en el campo Get aVar[26,1] VAR aVar[26,2]

- No entiendo como se vincula o interactua el EVENTO de la lectura del scanner(ReadComm y lo demas....) con el control del Get " Get aVar[26,1] VAR aVar[26,2] "

Podrian asesorarme

nuevamente,,,,, gracias Mike y Robert
Saludos