PROBLEMAS CON COMUNICACION SERIE
Posted: Mon Aug 06, 2012 9:46 am
Buenos dias, perdonarme pero soy practicamente nuevo en esto y me he encontrado con programamcion en fivewin que no conocia, mi problema es con la lectura del puerto serie, intento conectarme con una bascula y leer el peso que me envia pero en la informacion que recibo aparecen caracteres extraños y no recibo el peso correcto, a traves del hiperterminal recibo el peso con la misma trama siempre (una cara, tres espacios en blanco, el peso y un corazon), pero a mi en la aplicacion me llega otra cosa diferente (&wq78Ç), algunos valores del peso pero otros no llegan y caracteres extraños.
FUNCTION CapPes_Des(aAlias,aVars)
LOCAL cCad
cCad := ""
// abre puerto
IF !AbrePu_Des()
RETURN (NIL)
ENDIF
f_info("Ahora ponga el articulo en la bascula")
DO WHILE EMPTY(cCad)
// lee puerto
oCom1:ReadPort(5000)
// descarga el buffer
cCad:= StrCad_Des(oCom1:cBuffer)
ENDDO
// cierra puerto
oCom1:ClosePort()
// destruye objeto
DeleteObject(oCom1)
RETURN (.F.)
FUNCTION StrCad_Des (cCad)
LOCAL cStr,nCt
// inicia variables
cStr := ""
IF EMPTY(cCad)
RETURN ("")
ENDIF
FOR nCt := 1 TO LEN(cCad)
IF SUBSTR(cCad,nCt,1) $ "0123456789"
cStr += SUBSTR(cCad,nCt,1)
ENDIF
NEXT
RETURN (cStr)
FUNCTION AbrePu_Des (aAlias)
LOCAL cConf1,nConf2,cConf3,nConf4,nConf5,nConf6
// abre puertos serie para el scanner
cConf1 := "COM4"
nConf2 := 9600
cConf3 := "n"
nConf4 := 8
nConf5 := 1
nConf6 := 0.1
oCom1 := TRS232():New(cConf1,,,nConf2,cConf3,nConf4,nConf5,nConf6)
// control error
IF oCom1:nError <> 0
F_Stop("ERROR al abrir puerto.Maniobra abortada.")
RETURN (.F.)
ENDIF
F_INFO("PUERTO ABIERTO")
RETURN (.T.)
LA CLASE QUE UTULIZO ES
#INCLUDE "FIVEWIN.CH"
CLASS TRS232
// variables de instancia
DATA cCom // identificacion puerto
DATA nCom // numero identificacion puerto.
DATA cDcb // guarda la configuracion del puerto para lecturas
DATA cBuffer // buffer del puerto.
DATA nError // numero de error provocado.
DATA nDelay // tiempo de retardo de emisor.
// metodos
METHOD New() CONSTRUCTOR // metodo constructor
METHOD ClosePort() // cierra el puerto
METHOD WritePort() // escribir en el puerto
METHOD ReadPort() // leer puerto
METHOD Error() // control de errores
ENDCLASS
****************************************************************************
* *
* CONSTRUCTOR *
* *
****************************************************************************
METHOD New (cCom,nInBytes,nOutBytes,nBaud,cParity,nData,nStop,nDelay) CLASS TRS232
LOCAL cDcb,cError
// inicializa parametros por defecto
DEFAULT nInBytes := 1024
DEFAULT nOutBytes := 128
DEFAULT nDelay := 0
// inicializa variables de instancia
::cCom := cCom
::nError := 0
::nDelay := nDelay
// abrir el puerto
::nCom := OpenComm(::cCom,nInBytes,nOutBytes)
// control de error al abrir el puerto
IF ::nCom < 0
: :Error(1)
RETURN (SELF)
ENDIF
// configurar parametros del puerto
IF !BuildCommDcb(::cCom+":"+STR(nBaud)+","+cParity+","+STR(nData)+","+STR(nStop),@cDcb)
::Error(2)
::ClosePort()
RETURN (SELF)
ENDIF
// comprobar estado del puerto
IF !SetCommState(cDcb)
::Error(3)
::ClosePort()
ENDIF
// guarda la configuracion enviada por BuidCommDcb
::cDcb := cDcb
RETURN (SELF)
****************************************************************************
* *
* LEER EN EL PUERTO *
* *
****************************************************************************
METHOD ReadPort (nTime) CLASS TRS232
LOCAL cBuffer,lSalir,oTimer
// inicializa parametros por defecto
DEFAULT nTime := 0 // tiempo en milisegundos intentando leer
// inicializa variables
lSalir := .F.
// objeto TIMER (temporizador para una lectura finita (0=ilimitado))
IF nTime > 0
oTimer := TTimer():New(nTime,{|| lSalir:=.T. })
oTimer:Activate()
ENDIF
// proceso
DO WHILE !lSalir
* leer el puerto
cBuffer := ::cDcb
IF ReadComm(::nCom,@cBuffer) > 0
::cBuffer := cBuffer
lSalir := .T.
ENDIF
* tiempo de espera antes de vaciar el buffer
SysWait(::nDelay)
* vacia el buffer
IF FlushComm(::nCom,0) <> 0
::Error(6)
RETURN (.F.)
ENDIF
* refresca sistema
SysRefresh()
ENDDO
// destruye el temporizador
IIF(nTime>0,oTimer:Deactivate(),)
RETURN (NIL)
FUNCTION CapPes_Des(aAlias,aVars)
LOCAL cCad
cCad := ""
// abre puerto
IF !AbrePu_Des()
RETURN (NIL)
ENDIF
f_info("Ahora ponga el articulo en la bascula")
DO WHILE EMPTY(cCad)
// lee puerto
oCom1:ReadPort(5000)
// descarga el buffer
cCad:= StrCad_Des(oCom1:cBuffer)
ENDDO
// cierra puerto
oCom1:ClosePort()
// destruye objeto
DeleteObject(oCom1)
RETURN (.F.)
FUNCTION StrCad_Des (cCad)
LOCAL cStr,nCt
// inicia variables
cStr := ""
IF EMPTY(cCad)
RETURN ("")
ENDIF
FOR nCt := 1 TO LEN(cCad)
IF SUBSTR(cCad,nCt,1) $ "0123456789"
cStr += SUBSTR(cCad,nCt,1)
ENDIF
NEXT
RETURN (cStr)
FUNCTION AbrePu_Des (aAlias)
LOCAL cConf1,nConf2,cConf3,nConf4,nConf5,nConf6
// abre puertos serie para el scanner
cConf1 := "COM4"
nConf2 := 9600
cConf3 := "n"
nConf4 := 8
nConf5 := 1
nConf6 := 0.1
oCom1 := TRS232():New(cConf1,,,nConf2,cConf3,nConf4,nConf5,nConf6)
// control error
IF oCom1:nError <> 0
F_Stop("ERROR al abrir puerto.Maniobra abortada.")
RETURN (.F.)
ENDIF
F_INFO("PUERTO ABIERTO")
RETURN (.T.)
LA CLASE QUE UTULIZO ES
#INCLUDE "FIVEWIN.CH"
CLASS TRS232
// variables de instancia
DATA cCom // identificacion puerto
DATA nCom // numero identificacion puerto.
DATA cDcb // guarda la configuracion del puerto para lecturas
DATA cBuffer // buffer del puerto.
DATA nError // numero de error provocado.
DATA nDelay // tiempo de retardo de emisor.
// metodos
METHOD New() CONSTRUCTOR // metodo constructor
METHOD ClosePort() // cierra el puerto
METHOD WritePort() // escribir en el puerto
METHOD ReadPort() // leer puerto
METHOD Error() // control de errores
ENDCLASS
****************************************************************************
* *
* CONSTRUCTOR *
* *
****************************************************************************
METHOD New (cCom,nInBytes,nOutBytes,nBaud,cParity,nData,nStop,nDelay) CLASS TRS232
LOCAL cDcb,cError
// inicializa parametros por defecto
DEFAULT nInBytes := 1024
DEFAULT nOutBytes := 128
DEFAULT nDelay := 0
// inicializa variables de instancia
::cCom := cCom
::nError := 0
::nDelay := nDelay
// abrir el puerto
::nCom := OpenComm(::cCom,nInBytes,nOutBytes)
// control de error al abrir el puerto
IF ::nCom < 0
: :Error(1)
RETURN (SELF)
ENDIF
// configurar parametros del puerto
IF !BuildCommDcb(::cCom+":"+STR(nBaud)+","+cParity+","+STR(nData)+","+STR(nStop),@cDcb)
::Error(2)
::ClosePort()
RETURN (SELF)
ENDIF
// comprobar estado del puerto
IF !SetCommState(cDcb)
::Error(3)
::ClosePort()
ENDIF
// guarda la configuracion enviada por BuidCommDcb
::cDcb := cDcb
RETURN (SELF)
****************************************************************************
* *
* LEER EN EL PUERTO *
* *
****************************************************************************
METHOD ReadPort (nTime) CLASS TRS232
LOCAL cBuffer,lSalir,oTimer
// inicializa parametros por defecto
DEFAULT nTime := 0 // tiempo en milisegundos intentando leer
// inicializa variables
lSalir := .F.
// objeto TIMER (temporizador para una lectura finita (0=ilimitado))
IF nTime > 0
oTimer := TTimer():New(nTime,{|| lSalir:=.T. })
oTimer:Activate()
ENDIF
// proceso
DO WHILE !lSalir
* leer el puerto
cBuffer := ::cDcb
IF ReadComm(::nCom,@cBuffer) > 0
::cBuffer := cBuffer
lSalir := .T.
ENDIF
* tiempo de espera antes de vaciar el buffer
SysWait(::nDelay)
* vacia el buffer
IF FlushComm(::nCom,0) <> 0
::Error(6)
RETURN (.F.)
ENDIF
* refresca sistema
SysRefresh()
ENDDO
// destruye el temporizador
IIF(nTime>0,oTimer:Deactivate(),)
RETURN (NIL)