leer desde puerto serial
necesito saber como leer datos de un puerto serial de una pesa electronica para camiones, desde ya gracias
Podrias enviarme alguna ayuda referente al mismo tema de tu consulta, necesito tomar datos de una balanza electrónica serial para joyerias.
Desde ya Gracias
Desde ya Gracias
Ricardo C. escribio. El procedimiento de hacerlo es como sigue:
1.- instanciar un objeto de Mscomm. Anclando el objeto en un form.
2.- especificar propiedades del puerto: velocidad, paridad, bit de datos, bit de parada, etc. (Settings)
3.- abrir puerto
4.- checar si hay datos en puerto, ya sea con un objeto timer para que a intervalos regulares obtenga los datos.
te adjunto un archivo donde viene el codigo que estoy usando para leer el puerto, y te voy a recomendar que busques mas informacion en el msdn o en el sitio de microsoft, para que veas las propiedades del objeto.
a mi me ha funcionado bien en, espero y te sirva
*** rutina para abrir puerto serial de comunicaciones
public oCom
public SendCmd
public firstTime
* creAR OBJETO
SendCmd = .F. && para determinar si requiere enviar comando para
* obtener data
FirstTime = .T.
oCom = Createobject ("MSCOMMLIB.MSCOMM")
oCom.CommPort = 1
oCom.Settings = "9600,N,8,1"
oCom.inputlen = 0
oCom.inputmode = 0
oCom.Rthreshold = 1
oCom.Inbuffercount = 0
oCom.PortOpen = .T.
* VALIDAR SI HAY DATOS EN EL PUERTO, ESTO LO TENGO EN UN OBJ TIMER
* if thisform.txtpesobasc.value =0
ocom.portopen =.T.
thisform.btn.fillcolor = rgb (255,0,0)
*ESTE EVENTO ME DEVUELVE 2 SI HAY DATOS EN EL BUFFER
evento = ocom.Commevent
if evento = 2
*
oCom.inputlen = 1 && LE DIGO QUE LA LECTURA ES DE 1 EN 1 BYTES
RESULTADO = ""
ltmp = ''
X = 1
xcount = 10
lnume = ''
*
* messagebox(str(OCOM.INBUFFERSIZE))
DO WHILE X <= OCOM.INBUFFERSIZE
x1 = ocom.input && TOMA EL DATO DEL PUERTO
if x1 = chr(13) or x1 = chr(10)
ltmp = ltmp + " "
exit do
else
ltmp = ltmp + x1
endif
if val(x1)> 0 or x1 = "0" or x1 = "." or x1= '-'
lnume = lnume + x1
endif
X= X+1
ENDDO
resultado = ltmp
*resultado1 = val(resultado)
MESSAGEBOX ( resultado,"peso")
Ocom.inbuffercount =0
if val(lnume) <> 0
* wait window( 'leyendo peso') nowait
thisform.txtpesobasc.value = val(lnume)
* thisform.txtkgs.value = thisform.txtpesobasc.value
* thisform.txtneto.value = thisform.txtkgs.value -
thisform.txttara.value
* thisform.refresh
thisform.btn.fillcolor = rgb (0,255,0)
endif
ocom.portopen =.F.
thisform.refresh
endif
***********
Otra forma es usando funciones de bajo nivel, FOPEN, FCLOSE, FREAD, etc.
1.- instanciar un objeto de Mscomm. Anclando el objeto en un form.
2.- especificar propiedades del puerto: velocidad, paridad, bit de datos, bit de parada, etc. (Settings)
3.- abrir puerto
4.- checar si hay datos en puerto, ya sea con un objeto timer para que a intervalos regulares obtenga los datos.
te adjunto un archivo donde viene el codigo que estoy usando para leer el puerto, y te voy a recomendar que busques mas informacion en el msdn o en el sitio de microsoft, para que veas las propiedades del objeto.
a mi me ha funcionado bien en, espero y te sirva
*** rutina para abrir puerto serial de comunicaciones
public oCom
public SendCmd
public firstTime
* creAR OBJETO
SendCmd = .F. && para determinar si requiere enviar comando para
* obtener data
FirstTime = .T.
oCom = Createobject ("MSCOMMLIB.MSCOMM")
oCom.CommPort = 1
oCom.Settings = "9600,N,8,1"
oCom.inputlen = 0
oCom.inputmode = 0
oCom.Rthreshold = 1
oCom.Inbuffercount = 0
oCom.PortOpen = .T.
* VALIDAR SI HAY DATOS EN EL PUERTO, ESTO LO TENGO EN UN OBJ TIMER
* if thisform.txtpesobasc.value =0
ocom.portopen =.T.
thisform.btn.fillcolor = rgb (255,0,0)
*ESTE EVENTO ME DEVUELVE 2 SI HAY DATOS EN EL BUFFER
evento = ocom.Commevent
if evento = 2
*
oCom.inputlen = 1 && LE DIGO QUE LA LECTURA ES DE 1 EN 1 BYTES
RESULTADO = ""
ltmp = ''
X = 1
xcount = 10
lnume = ''
*
* messagebox(str(OCOM.INBUFFERSIZE))
DO WHILE X <= OCOM.INBUFFERSIZE
x1 = ocom.input && TOMA EL DATO DEL PUERTO
if x1 = chr(13) or x1 = chr(10)
ltmp = ltmp + " "
exit do
else
ltmp = ltmp + x1
endif
if val(x1)> 0 or x1 = "0" or x1 = "." or x1= '-'
lnume = lnume + x1
endif
X= X+1
ENDDO
resultado = ltmp
*resultado1 = val(resultado)
MESSAGEBOX ( resultado,"peso")
Ocom.inbuffercount =0
if val(lnume) <> 0
* wait window( 'leyendo peso') nowait
thisform.txtpesobasc.value = val(lnume)
* thisform.txtkgs.value = thisform.txtpesobasc.value
* thisform.txtneto.value = thisform.txtkgs.value -
thisform.txttara.value
* thisform.refresh
thisform.btn.fillcolor = rgb (0,255,0)
endif
ocom.portopen =.F.
thisform.refresh
endif
***********
Otra forma es usando funciones de bajo nivel, FOPEN, FCLOSE, FREAD, etc.
Consulten estos enlaces:
http://www.portalfox.com/modules.php?op=modload&name=News&file=article&sid=1020
http://www.portalfox.com/modules.php?op=modload&name=News&file=article&sid=416
http://www.portalfox.com/modules.php?op=modload&name=News&file=article&sid=1020
http://www.portalfox.com/modules.php?op=modload&name=News&file=article&sid=416
