mscomm32 puerto serie (e-mail correcto)

Luis Rodriguez
04 de Septiembre del 2003
Disculpen, pero en el mensaje anterior está malo el e-mail

---------------------------------------
Les escribo este mensaje para pedirte ayuda sobre ul uso del mscomm32 en VFP.

Necesito capturar el peso desde una balanza que se conecta al PC al Puerto Serial.

Las instrucciones que utilizo con las siguientes:

thisform.PuertoComm.Commport=1
thisform.PuertoComm.Settings="4800,e,7,1" & e=con paridad ???
thisform.PuertoComm.Handshaking=0
thisform.PuertoComm.Inputmode=0

thisform.PuertoComm.Portopen=.T.
thisform.PuertoComm.Inputlen=0
thisform.PuertoComm.InBufferCount=0

cValor = ""
for i=1 to 350
cValor=Thisform.PuertoComm.Input
endfor

Resulta que cuando muestro el valor de "cValor" me muestra caracteres extraños.
Pero cuando convierto esa cadena a ASCII me muestra distintos números que tienen relación con el peso.

Les agradeceré cualquier ayuda que puedan brindarme.

Atte. Luis Rodríguez

andnic
04 de Septiembre del 2003
Hola Luis:
Para poder comunicarte con la balanza necesitas del protocolo de comunicacion de esta, debe haber un manual de la balanza que indica este protocolo.
Te envio el codigo de una clase en base al objeto mscomm que hice para recepcionar los datos de una balanza marca lp-net.

&& lAttached y cStatus son propiedades que he agregado al formulario para determinar si hubo conexion (lAttached) y para mostrar un mensaje de estado (cStatus)

procedure recepcion
local nS
this.commport = 2
this.settings = "9600,n,8,1"
this.InBufferCount = 0
this.InputLen = 1
this.portopen = .t.

*paso1 Sondeo: Enviar SOH+Chanel+ENQ
this.output = SOH + '01' + ENQ
this.lAttached = 1
nS = seconds()
do while second()-nS < this.nSecEspera
* Paso 2: Recibir ACK, respuesta de la balanza
c = this.input
if asc(c)=0
=inke(0.5,'hm')
endi
do case
case c = chr(6) &&ACK
this.lAttached = 0
exit
case c = EOT
this.cStatus = 'Paso 1: ACK Error'
other
this.cStatus = 'Paso 1: TIMEOUT Error'
endc
endd
this.InputLen = 87

if this.lAttached = 0
*paso3: Enviar COMMAND UP00+PLU Nº, indica recepcion de datos
if last()=27
this.cStatus = 'Proceso detenido por el usuario'
this.close
retu
endi
cComand = "UP00" + str(1,4,0) + ETX
this.output = cComand

* Paso 4: Recibir ACK/NAK, respuesta de la balanza
nS = second()
do whil seconds()-nS < this.nSecEspera
if last()=27
this.cStatus = 'Proceso detenido por el usuario'
this.close()
retu
endi
c = this.input
if asc(c) = 0
this.lAttached = 1
this.cStatus = "Paso 4: Balanza no responde"
=inke(1,'hm')
loop
endi
do case
case c = NAK
this.lAttached = 1
this.cStatus = "Paso 4: Error NAK"
case righ(c,1) = ETX
this.lAttached = 1
this.cStatus = "Paso 4: Recibi ETX"
BCCr = 0
for i = 2 to len(cData)-2
nChar = asc(subs(cData,i,1))
BCCr = bitxor(BCCr,nChar)
endf
exit
case c = EOT
this.lAttached = 0
this.cStatus = cData
this.output = EOT
exit
other
cData = cData + c
endc
endd
endi
*Paso 5: Enviar EOT, terminar la conexion
this.output = EOT
this.inputlen = 1
this.portopen = .f.
retu

Espero te siva