Abrir puerto al iniciar form o aplicación

174 views
Skip to first unread message

Jaime Barrientos

unread,
Mar 12, 2015, 4:26:57 PM3/12/15
to publice...@googlegroups.com
Muy buenas tardes, en una oportunidad acudí a este foro y fue de gran ayuda ya que me dieron solución a un problema que tenía para conectar un form a una balanza. En esta ocasión acudo a este grupo nuevamente por el siguiente inconveniente:

Tengo un form que toma el peso de la balanza, el proceso abre, luego utilizo un botón para pesar y otro para continuar al siguiente renglón de la factura. Eso funciona "relativamente bien" ya que si toma el peso, pero en ocasiones no, quedando en cero y arrojando un error. En otras oportunidades tengo que pulsar hasta 2 veces el botón pesar y de esta manera es que lee la información de la balanza. Un compañero me comentó una vez que debo hacer que cuando abra el sistema administrativo debo abrir el puerto de una vez, es decir, el puerto com siempre debe estar abierto o escuchando. A continuación coloco código de mi form para ver de que forma puede tomar el peso la balanza sin pulsar varias veces un botón o que no sea cuestión de suerte tomar el peso.

Saludos y agradecido de antemano...

****INIT DEL FORM****

PARAMETERS pforma
WITH this
.AutoCenter=.t.
.Icon=_screen.Icon
ENDWITH
IF VARTYPE(oCom)='U'
PUBLIC oCom
oCom=CREATEOBJECT("MSCOMMLib.MSComm")
WITH oCom
.InputLen=0
.CommPort=1
.Settings='9600,e,7,1'
.Handshaking=0
.InBufferCount=0
.RThreshold = 1
.PortOpen = .T.
ENDWITH
ENDIF

***BOTON DE PESO***

With oCom     && *** el nombre del objeto MSCOMM32
 .inBuffersize=1024
 .portopen = .T.
 .inputlen = 20
 .output ="W"+CHR(13) 
 Thisform.text1.Value = 0.000
 For x = 1 TO 10000
  el_peso = .input
  el_peso = RIGHT( el_peso, LEN( el_peso) - 1)
 el_peso = VAL( LEFT( el_peso, 7))

  If !Empty(el_peso)
  Thisform.text1.Value = el_peso
  Exit
  ENDIF
  
 ENDFOR
ENDWITH
thisform.text1.Refresh()

**BOTON PARA CONTINUAR**

PRIVATE tabatt
tabatt=thisform.text1.value
IF VARTYPE(tabatt)=='C'
tabatt=ROUND(VAL(tabatt),5)
endif

IF (tabatt)<=0
   resp=messagebox("Disculpe Debe Indicar Un Valor Distinto a 0, Verifique!",;
    0+48,thisform.Caption)  
 ELSE
  SELECT "vreng_fac"

replace vreng_fac.total_art WITH tabatt,vreng_fac.reng_neto WITH tabatt*vreng_fac.prec_vta

 endif
 thisform.release()      

*********Jaime

Carlos Alfaro

unread,
Mar 12, 2015, 5:53:54 PM3/12/15
to publice...@googlegroups.com

Saludos estimado amigo:

 

En el botón deberías aplicar lo siguiente:

 

If .portopen = .F. then

 .portopen = .T.

Endif

 

Te recomiendo que no uses un loop para esperar la respuesta, es mas estable usar un timer.

 

Bendiciones.

 

Carlos Alfaro

Carlos Alfaro

unread,
Mar 12, 2015, 6:07:54 PM3/12/15
to publice...@googlegroups.com

Saludos estimado amigo:

 

En el botón deberías aplicar lo siguiente:

 

If .portopen = .F. then

 .portopen = .T.

Endif

 

Te recomiendo que no uses un loop para esperar la respuesta, es mas estable usar un timer.

 

En el botón pesar, despues de:

 

 .output ="W"+CHR(13) 

Thisform.timer.interval = 500 && esta valor lo podes ajustar, si el string no llega completo, el valor debe ser mayor.

 

En el la propiedad timer del objeto timer espera el string y lo procesa:

 

If oCom.inbuffercount > 0 then

  This.interval = 0

  el_peso = oCom.input

  el_peso = RIGHT( el_peso, LEN( el_peso) - 1)

 el_peso = VAL( LEFT( el_peso, 7))

 

  If ¡Empty(el_peso)

     Thisform.text1.Value = el_peso

     thisform.text1.Refresh()

  ENDIF

Endif

 

 

Bendiciones.

 

Carlos Alfaro

 

From: publice...@googlegroups.com [mailto:publice...@googlegroups.com] On Behalf Of Jaime Barrientos
Sent: jueves, 12 de marzo de 2015 02:27 p.m.
To: publice...@googlegroups.com
Subject: [vfp] Abrir puerto al iniciar form o aplicación

 

Muy buenas tardes, en una oportunidad acudí a este foro y fue de gran ayuda ya que me dieron solución a un problema que tenía para conectar un form a una balanza. En esta ocasión acudo a este grupo nuevamente por el siguiente inconveniente:

Daniel Sánchez

unread,
Mar 12, 2015, 9:35:12 PM3/12/15
to Comunidad de Visual Foxpro en Español
No es un loop ni un timer para esperar a que venga los datos solo debes usar el método OnComm del objeto activex mscomm, el cual se dispara cuando algo llega por el puerto de comunicación 

procedure OnComm  &&del activex mscomm se llama olebascula

*** ActiveX Control Event ***
Evento = This.CommEvent
IF Evento = 2 && Recibo datos
      thisform.ProcesaEntrada
ENDIF 

en tu formulario el método procesaentrada

EL_PESO= thisform.olebascula.Input  &&esta en el buffer esperando que leas los datos que están en input

*/todo lo demás que esta de aquí hacia abajo es porque los datos venían de una manera especifica y tuve que analizarlo
elpeso=''
IF LEFT(el_peso,3)=" <0"
*/tengo peso exacto
elpeso=SUBSTR(el_peso,6,5)
ENDIF 
IF LEN(ALLTRIM(elpeso))=5
IF !EMPTY(elpeso)
elpeso=LEFT(elpeso,3)+"."+SUBSTR(elpeso,4)
ENDIF 
thisform.npesobalanza=VAL(elpeso)
ENDIF 


Para ver como llega los casos hay un programa que sirve para ver que datos viene por el puerto y con eso lo analizas y lo programas para mostrar la información de manera correcta, el nombre del programa me parece que es hyperterminal, si no es así que alguien del grupo me corriga.

Saludos
--
Daniel Sánchez Escobar
Investigación y Desarrollo
Reset Software & Sistemas
Móvil +051-949398047
Trujillo - Perú

P  Sugerimos no imprimir este e-mail a menos que sea absolutamente necesario. Protejamos el medio ambiente.

Carlos Alfaro

unread,
Mar 12, 2015, 10:58:56 PM3/12/15
to publice...@googlegroups.com

Estimado amigo Daniel:

 

Es importante mencionar que para que OnComm se active debe estar las siguientes propiedades seteadas asi:

 

RThresholdSThreshold

Estas dos propiedades especifican el número de caracteres que deben estar presentes en los Buffers de Recepción y Transmisión respectivamente, para que se produzca el evento OnComm relativo a recepción y transmisión de caracteres. (Eventos EvReceive y EvSend) Si el valor de una de estas propiedades está a 0, no se produce el evento OnComm correspondiente.

El valor que se debe dar a estas dos propiedades depende de la aplicación y del tiempo que queramos que la aplicación está atendiendo al puerto de comunicaciones. Concretamente para la propiedad RThreshold debemos pensar muy bien el valor que se le pone. Si ponemos un valor corto (1 es el mínimo), cada vez que reciba un carácter se producirá el evento OnComm.  Al producirse este evento, ejecutará el procedimiento asociado a él, lo que hará perder tiempo a la aplicación, impidiéndole realizar otras funciones.  Si se pone un valor muy alto, el puerto no avisará que tiene caracteres recibidos hasta que reciba un número igual al programado en esta propiedad, por lo que no podremos procesar los datos recibidos hasta que el buffer tenga ese número de caracteres en su interior. En número adecuado dependerá del tipo de aplicación que vayamos a realizar. En cualquier caso, este número será inferior al número programado para la longitud del buffer, (InBufferSize)

Bendiciones.

 

Carlos Alfaro

Daniel Sánchez

unread,
Mar 13, 2015, 8:53:17 AM3/13/15
to Comunidad de Visual Foxpro en Español
Hola Carlos el activex MSCOMMLib.MSComm.1, así es como aparece en la propiedad oleclass del objeto no tiene los eventos EvReceive y EvSend, además usando la propiedad RThreshold en uno no he tenido ningun problema, muestro los valores que manejo a continuación

Imágenes integradas 1Imágenes integradas 2

Saludos

Carlos Alfaro

unread,
Mar 14, 2015, 12:46:14 AM3/14/15
to publice...@googlegroups.com

Gracias por tu aclaración, que bien que te ha funcionado.

 

Feliz día.

image001.png
image002.png
Reply all
Reply to author
Forward
0 new messages