OT : Funciones para Comm
OT : Funciones para Comm
Saludos a todos.
Alguien me podría explicar como puedo manejar las funciones para puertos Comm
Muchas gracias por adelantado.
Alguien me podría explicar como puedo manejar las funciones para puertos Comm
Muchas gracias por adelantado.
Vikthor
Re: OT : Funciones para Comm
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
João Santos - São Paulo - Brasil
- jose_murugosa
- Posts: 943
- Joined: Mon Feb 06, 2006 4:28 pm
- Location: Uruguay
- Contact:
Re: OT : Funciones para Comm
Usando HBComm el tema es que hay que depurar alguna basurilla que aparece en la captura.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
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
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
http://fivetechsoft.com/forums/viewtopic.php?t=3738
o en mi host:
http://www.box.net/shared/sa6rse88cq
Espero que te sea de utilidad
Saludos/Regards,
José Murugosa
FWH + Harbour + Bcc7. Una seda!
José Murugosa
FWH + Harbour + Bcc7. Una seda!
Re: OT : Funciones para Comm
Gracias Jose :
La gran duda que tengo , son los valores que devuelve, me podrías dar una breve explicación.
La gran duda que tengo , son los valores que devuelve, me podrías dar una breve explicación.
Vikthor
Re: OT : Funciones para Comm
http://www.fivewin.com.br/exibedicas.asp?id=606Vikthor wrote:Gracias Jose :
La gran duda que tengo , son los valores que devuelve, me podrías dar una breve explicación.
João Santos - São Paulo - Brasil
Re: OT : Funciones para Comm
karinha wrote:http://www.fivewin.com.br/exibedicas.asp?id=606Vikthor wrote:Gracias Jose :
La gran duda que tengo , son los valores que devuelve, me podrías dar una breve explicación.
Gracias
Vikthor
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
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: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
Usted con esta funcion, consegue dar lectura en Lectores de Codigos de Barras?
Regards, saludos.
João Santos - São Paulo - Brasil
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
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.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
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.
João Santos - São Paulo - Brasil
men.. te dejo parte de codigo para accesar al comm
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