Page 1 of 1
OT : Funciones para Comm
Posted: Tue Sep 18, 2007 4:08 pm
by Vikthor
Saludos a todos.
Alguien me podría explicar como puedo manejar las funciones para puertos Comm
Muchas gracias por adelantado.
Re: OT : Funciones para Comm
Posted: Tue Sep 18, 2007 4:30 pm
by karinha
Vikthor wrote:Saludos a todos.
Alguien me podría explicar como puedo manejar las funciones para puertos Comm
Muchas gracias por adelantado.
USE A HBCOMM.LIB
Re: OT : Funciones para Comm
Posted: Tue Sep 18, 2007 4:35 pm
by jose_murugosa
karinha wrote:Vikthor wrote:Saludos a todos.
Alguien me podría explicar como puedo manejar las funciones para puertos Comm
Muchas gracias por adelantado.
USE A HBCOMM.LIB
Usando HBComm el tema es que hay que depurar alguna basurilla que aparece en la captura.
Yo lo hago así:
xTara:=Captura(oBtn1)
Funcion captura:
Code: Select all
FUNCTION Captura(oBtn1)
Local tmpbuf := "", cPeso, nPeso, i, TxtCap, ;
f_Com := "COM1", ;
f_BaudeRate := 9600 , ;
f_databits := 8 , ;
f_parity := 0 , ;
f_stopbit := 1 , ;
f_Buff := 5
//abro el puerto
IF !Init_Port( f_Com, f_BaudeRate , f_databits , f_parity ,f_stopbit , f_Buff )
MsgInfo("El Puerto No se ha conectado!","PROBLEMA TECNICO")
ENDIF
//Capturo
FOR I=1 to f_Buff
txtcap:=InChr(i)
TxtCap:=SacoBasura( TxtCap )
TmpBuf+= TxtCap
NEXT
//cierro puerto
UnInt_Port()
cPeso:=Substr(tmpbuf, At(StrCtrl, tmpbuf), 8) // aca es donde salteo carater de control
cPeso:=IF( at( StrCtrl, cPeso )=0, "REPETIR", cPeso) // \/
If(cPeso="REPETIR", ( oBtn1:SetFocus(), MsgInfo(cPeso), nPeso:=0 ), npeso:=Val( Substr(cPeso,2,6) ) )
RETURN nPeso
FUNCION depuradora de la captura (para sacar basura)
Code: Select all
Function SacoBasura(cstring)
local astr:=Array(Len(cstring)), str:="",nstr:=0, i:=0
for i=1 to len(cstring)
astr[i]:=Substr(cstring, i, 1)
NEXT i
for i=1 to len(cstring)
if ( Asc(astr[i])>=48 .and. Asc(astr[i])<=57) .or. astr[i]=StrCtrl // .or. astr[i]="+"
str+=astr[i]
endif
next i
RETURN STR
Puedes obtenerla en el foro de utilidades
http://fivetechsoft.com/forums/viewtopic.php?t=3738
o en mi host:
http://www.box.net/shared/sa6rse88cq
Espero que te sea de utilidad
Re: OT : Funciones para Comm
Posted: Tue Sep 18, 2007 4:49 pm
by Vikthor
Gracias Jose :
La gran duda que tengo , son los valores que devuelve, me podrías dar una breve explicación.
Re: OT : Funciones para Comm
Posted: Tue Sep 18, 2007 5:26 pm
by karinha
Vikthor wrote:Gracias Jose :
La gran duda que tengo , son los valores que devuelve, me podrías dar una breve explicación.
http://www.fivewin.com.br/exibedicas.asp?id=606
Re: OT : Funciones para Comm
Posted: Tue Sep 18, 2007 5:37 pm
by Vikthor
Gracias
Posted: Wed Sep 19, 2007 12:48 pm
by cmsoft
Vicktor, tambien podes manejar los comm con las funciones que trae Fivewin sin necesidad de incorporar librerias de 3ros.
Por ejemplo, para abrir el puerto utilizo:
FUNCTION abrirport(n)
LOCAL IdPort,cDcb,nError
IdPort := OpenComm("COM"+STR(n,1),1024,256)
IF IdPort <= 0
nError = GetCommError( IdPort)
MsgInfo( "Error al abrir: " + Str( nError ) )
ELSE
MsgRun("Puerto abierto como " + STR(IdPort))
ENDIF
IF ! BuildCommDcb("COM"+STR(n,1)+":9600,n,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
RETURN IdPort
Para leer del puerto utilizo:
texto_a_leer := SPACE(10)
nBytes := ReadComm( port,@texto_a_leer)
Para escribir en el puerto utilizo:
nBytes := WriteComm( port,string)
Con estos comandos, he logrado comunicarme con una registrador fiscal, desarrollando el protocolo de la misma sin ningun problema.
Como nota importante, para versiones de Fivewin 2.7 o anterior, Antonio Linares me paso un .obj (COMM.OBJ) que era necesario para que la comunicación funciones sin problemas.
Espero que te sirva la data.
Atte
Cesar
Posted: Wed Sep 19, 2007 1:34 pm
by karinha
cmsoft wrote:Vicktor, tambien podes manejar los comm con las funciones que trae Fivewin sin necesidad de incorporar librerias de 3ros.
Por ejemplo, para abrir el puerto utilizo:
FUNCTION abrirport(n)
LOCAL IdPort,cDcb,nError
IdPort := OpenComm("COM"+STR(n,1),1024,256)
IF IdPort <= 0
nError = GetCommError( IdPort)
MsgInfo( "Error al abrir: " + Str( nError ) )
ELSE
MsgRun("Puerto abierto como " + STR(IdPort))
ENDIF
IF ! BuildCommDcb("COM"+STR(n,1)+":9600,n,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
RETURN IdPort
Para leer del puerto utilizo:
texto_a_leer := SPACE(10)
nBytes := ReadComm( port,@texto_a_leer)
Para escribir en el puerto utilizo:
nBytes := WriteComm( port,string)
Con estos comandos, he logrado comunicarme con una registrador fiscal, desarrollando el protocolo de la misma sin ningun problema.
Como nota importante, para versiones de Fivewin 2.7 o anterior, Antonio Linares me paso un .obj (COMM.OBJ) que era necesario para que la comunicación funciones sin problemas.
Espero que te sirva la data.
Atte
Cesar
Cesar, Por favor Informe:
Usted con esta funcion, consegue dar lectura en Lectores de Codigos de Barras?
Regards, saludos.
Posted: Wed Sep 19, 2007 2:49 pm
by cmsoft
Hola karinha:
No, la comunicacion es con una registradora fiscal, la cual tiene un protocolo establecido, y por lo tanto, siguiendo dicho protocolo, debo esperar y enviar los comandos y datos apropiados.
Igualmente, para leer codigos de barras, existen los emuladores de teclado, que se encargan de enviar señales de teclado cuando pasa el producto por el scanner. No se que lector tendrás y si el mismo tiene emulador de teclado, pero siempre, para _, la mejor opcion es poner un scanner (lector de codigos de barras) con emulacion.
Espero te sirva la data.
Atte
Cesar
Posted: Wed Sep 19, 2007 4:08 pm
by karinha
cmsoft wrote:Hola karinha:
No, la comunicacion es con una registradora fiscal, la cual tiene un protocolo establecido, y por lo tanto, siguiendo dicho protocolo, debo esperar y enviar los comandos y datos apropiados.
Igualmente, para leer codigos de barras, existen los emuladores de teclado, que se encargan de enviar señales de teclado cuando pasa el producto por el scanner. No se que lector tendrás y si el mismo tiene emulador de teclado, pero siempre, para _, la mejor opcion es poner un scanner (lector de codigos de barras) con emulacion.
Espero te sirva la data.
Atte
Cesar
Gracias César por aclararme la duda.
Acá en Brasil, no és posible. Tengo que usar la HBCOMM.LIB, por sinal, mui buena. Alias, Un excelente trabajo de las personas del proyecto XHARBOUR.
Regards, saludos.
men.. te dejo parte de codigo para accesar al comm
Posted: Thu Sep 20, 2007 12:55 am
by gabo
Code: Select all
/*-----------------------------------------------------------------------------------------------*/
METHOD RecibeDatos() CLASS TAnviz
LOCAL oGauge, oProgress
DEFINE DIALOG oGauge RESOURCE "DLG_PROCESO"
oProgress:= TProgress():Redefine( 1000, oGauge )
oGauge:bStart := { || ReadBufferComm(Self, oProgress, oGauge) }
oGauge:bGotFocus:= { || oProgress:SetFocus() }
ACTIVATE DIALOG oGauge CENTERED
RETURN NIL
/*-----------------------------------------------------------------------------------------------*/
STATIC FUNCTION ReadBufferComm( oLector, oBarra, oDialogo )
LOCAL oDlg, oLbx, oFile, cFechas, cHoras, lGrabalo
LOCAL hDatos, nBytes, cBuffer, cLinea, aRecords, nRecCount, cHora, cMinu, cSegu
LOCAL lPrimeraVez, cBuffTemp, nPos, nTotRecords, cLineaAux, nn, cAnio, cMes, cDia, cClave
hDatos:= OutChr( "("+ oLector:ps_NOSERIE + ",kqdata)" ) // Envia un comando al puerto comm
cBuffer:= ""
nBytes := 200
cLinea := ""
aRecords:= {}
lPrimeraVez:= .T.
nTotRecords:= 1
DO WHILE .T.
cBuffer:= ""
nBytes := InbufSize()
IF nBytes > 0
cBuffer:= InChr( 1000 )
IF At( "kqdata,ok", cBuffer ) > 0
IF lPrimeraVez
cBuffTemp:= cBuffer
cBuffTemp:= SubStr( cBuffTemp, 1, 22 )
nRecCount:= Val( SubStr( cBuffTemp, 16, 6 ) )
lPrimeraVez:= .F.
oBarra:SetRange( 1, nRecCount )
oBarra:SetPos( nTotRecords )
SysRefresh()
ENDIF
ENDIF
IF At( "kqdataend,ok", cBuffer ) > 0
IF Len( AllTrim( cBuffer ) ) > 0
cLineaAux:= BufferClean( cBuffer, oBarra, @nTotRecords )
cLinea+= cLineaAux
ENDIF
EXIT
ELSE
IF Len( AllTrim( cBuffer ) ) > 0
cLineaAux:= BufferClean( cBuffer, oBarra, @nTotRecords )
ENDIF
cLinea+= cLineaAux
ENDIF
SysRefresh()
ENDIF
ENDDO
oDialogo:END()
oFile:= TTxtFile():New( oLector:cPathDbf + "checadas.eds" )
oFile:PutStr( cLinea )
oFile:Close()
aRecords:= str2a( cLinea, CRLF )
FOR nn:= 1 TO Len( aRecords )
cClave:=SubStr(aRecords[nn],9,4)
cAnio:= SUBSTR( aRecords[nn], 14, 2 )
cMes := SUBSTR( aRecords[nn], 16, 2 )
cDia := SUBSTR( aRecords[nn], 18, 2 )
cHora:= SUBSTR( aRecords[nn], 21, 2 )
cMinu:= SUBSTR( aRecords[nn], 23, 2 )
cSegu:= SUBSTR( aRecords[nn], 25, 2 )
lGrabalo:= .T.
cHoras := cHora+":"+cMinu+":"+csegu
cFechas:= cDia+"/"+cMes+"/"+cAnio
IF Empty( cHora ) .OR. Empty( cMinu ) .OR. Empty( cSegu ) .OR. Empty( cDia ) .OR. Empty( cMes ) .OR. Empty( cAnio )
lGrabalo:= .F.
ENDIF
IF lGrabalo
IF AddRecord( "CHECADAS" )
checadas->CLAVE:= cClave
checadas->FECHA:= CToD( cFechas )
checadas->HORA := cHoras
checadas->( DbUnLock() )
ENDIF
ENDIF
NEXT nn
RETURN NIL
/*----------------------------------------------------------------------------------------------------*/
STATIC FUNCTION BufferClean( cStrBuff, oBarra, nRecords )
LOCAL nPos1, nPos2, cStrAuxil, cSTrClean, cChrClean, nn, cChar
cStrClean:= ""
DO WHILE Len( AllTrim(cStrBuff) ) > 0
nPos1:= AT( "(", cStrBuff )
nPos2:= AT( ")", cStrBuff )
IF nPos1 > 0
cStrAuxil:= SubStr( cStrBuff, nPos1, nPos2 )
cStrAuxil:= StrTran( cStrAuxil, CRLF, "" )
IF Len( AllTrim( cStrAuxil ) ) = 0
EXIT
ENDIF
cChrClean:= ""
FOR nn:= 1 TO Len( cStrAuxil )
cChar:= SubStr( cStrAuxil, nn, 1 )
IF ( Asc( cChar )>=48 .and. Asc( cChar )<= 57 ) .OR. ;
( Asc( cChar )>=97 .and. Asc( cChar )<=122 ) .OR. ;
cChar = "(" .OR. cChar = ")" .OR. cChar = ","
cChrClean+= cChar
ENDIF
NEXT
SysRefresh()
++nRecords
cStrClean+= cChrClean + CRLF
cStrBuff := SubStr( cStrBuff, nPos2+1 )
oBarra:SetPos( nRecords )
ELSE
EXIT
ENDIF
// SysRefresh()
ENDDO
RETURN cStrClean
Saludos