Lectura de puertos seriales..

Lectura de puertos seriales..

Postby Busmatic_wpb » Tue Jan 30, 2018 11:36 pm

Estimados Listeros.

Estoy tratando de leer el puerto serial de mi PC donde tengo un en COM2 un pocesador de imagenes (contador de personas) con camaras. Bien uso un programa de terceros que base por ahi y trabaja de maravillas, envia y lee perfectamente. (utilizo el mismo seteo de COM2)

Mi problema se da en la siguiente instruccion.

if ( BitesSend := WriteComm( nComm, "02 30 30 30 31 31 33 30 30 31 34 03" )) > 0
msgwait('Sen han enviado'+str(BitesSend,5),'',.900)
ENDIF

Donde este string "02 30 30 30 31 31 33 30 30 31 34 03" es un comando al contador de personas donde deveria
de devolver el siguiente estring 000193100000006800000091000000000000000019

Con la lectura no hay problema es con la escritura, que aunque mando el comando no retorna nada.

Con este programa trabaja de bien
http://www.busmaticcr.com/pantalla.bmp

Haber en que me pueden ayudar pues he tratado y he bajado todos los ejemplos del sitio y no logro.

Dejo a Continuacion el Programa.

#include "Fivewin.ch"

function LeErPuertos()

Local cDcb, lError, nError
Local nComm := OpenComm( "COM2", 4024, 1024 )


if ! BuildCommDcb( "COM2:9600,N,8,1", @cDcb )
MsgStop( "Error BUILD!" )
return .f.
endif

#ifdef __CLIPPER__
if ! SetCommState( cDcb )
#else
if ! SetCommState( nComm, cDcb )
#endif
MsgStop( "Error SETCOMM!" )
return .f.
endif

/*
"02 30 30 30 31 31 33 30 30 31 34 03" este es un comando de procesador de imagenes stereo camaras
y deberia de devolver esto 000193100000006800000091000000000000000019

*/

if ( BitesSend := WriteComm( nComm, "02 30 30 30 31 31 33 30 30 31 34 03" )) > 0
msgwait('Sen han enviado'+str(BitesSend,5),'',.5000)
ENDIF


cBlock=space(1024)
nTry=0

do while nTry<10 // can remove this nTry if not applicable

if ( nBytes := readComm( nComm, @cBlock) ) > 0
msgwait('Esperando haber si lee algo , espere'+str(nTry,5),'',.10)
LogFile( "Milagros.log", cBlock)
exit
else
nTry++
msgwait('Leyendo Puerto ... Ahora.. '+str(nTry,5),'Haber si logramos ver algo ',.900)
endif

if nTry==10
LogFile( "Milagros.log", cBlock)
Quit
endif


if ( BitesSend := WriteComm( nComm, "02 30 30 30 31 31 33 30 30 31 34 03" )) > 0
msgwait('Sen han enviado'+str(BitesSend,5),'',.900)
ENDIF


enddo


if FlushComm( nComm, 0 ) != 0
nError = GetCommError( nComm )
Msgwait( 'Error Limpiando el COM Error:' ,'',.01 )
endif

if ! CloseComm( nComm )
nError = GetCommError( nComm )
Msgwait( 'No Pude cerror el com Error: ' ,'',.01 )
endif


return nil
Busmatic_wpb
 
Posts: 74
Joined: Wed Feb 22, 2017 2:19 am

Re: Lectura de puertos seriales..

Postby karinha » Wed Jan 31, 2018 6:21 pm

No comprendo perfecto, pero mira el CHR correcto y haga: CHR(..)+Numeros+ CHR(..)

http://www.theasciicode.com.ar/extended-ascii-code/graphic-character-low-density-dotted-ascii-code-176.html

Si no és esto, 1000 desculpas.

Saludos.
João Santos - São Paulo - Brasil
karinha
 
Posts: 3664
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Lectura de puertos seriales..

Postby Busmatic_wpb » Thu Feb 01, 2018 1:03 am

Karina Gracias.
No te agradezco tu respuesta pero ando buscando el problema de WriteComm que no me funciona.
Gracias
Busmatic_wpb
 
Posts: 74
Joined: Wed Feb 22, 2017 2:19 am

Re: Lectura de puertos seriales..

Postby Antonio Linares » Thu Feb 01, 2018 11:49 am

Oscar,

Que valor recibe BitesSend ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 35350
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Lectura de puertos seriales..

Postby Busmatic_wpb » Sat Feb 03, 2018 1:59 am

Gracias por contestar .
Ninguno, no recibo valor alguno, vacio. buffers es de 36 maximo retorno, tampo

Ahora me explico, este aparato utiliza puerto 485 y tuve que comprar un convertidor de USB a 485. Ahora con el programa de terceros trabaja bien , cuando le envio el comando no tengo respuesta.
Este convertidor crea un puerto COM3, no hay problema por ahio tampoco.

http://www.busmaticcr.com/pantalla.bmp

Aqui podras ver que es un lector de puertos , simple y trabaja bien , los fabricantes me ha dicho que envie la cadena de comandos arriba citada, y retorna lo que mostre anteriormente.

No tengo idea si por ser protocolo 485 es diferente o tendre que mandar otro comando propio de la clase , no tengo idea tengo meses de pelear investigar todos los ejemplos en el foro ma los que estan por ahi y no logro llegarle . No es problema seteo porque utilizo los mismo en ambas aplicaciones.

Agradeceria de antemano cualquier compañero que tgenga alguna idea o haya tratado antes estos protocolos con puertos USB a 485 utilizamdo un convertidor cualquier posible idea o agradeceria pues aveces son cosas que no estan explicitas ..

Se le agradecera cualquier ayuda soy todos oidos
Busmatic_wpb
 
Posts: 74
Joined: Wed Feb 22, 2017 2:19 am

Re: Lectura de puertos seriales..

Postby Busmatic_wpb » Sat Feb 03, 2018 3:08 am

Perdon Estimado, el BitesSend retorna 36 el largo de la cadena que se envia
Gracias .
Busmatic_wpb
 
Posts: 74
Joined: Wed Feb 22, 2017 2:19 am

Re: Lectura de puertos seriales..

Postby Antonio Linares » Sat Feb 03, 2018 5:38 am

En vez de hacer:

LogFile( "Milagros.log", cBlock )

prueba con:

LogFile( "Milagros.log", Buffer( cBlock ) )

...

function Buffer( cBlock )

local n, cResultado := ""

for n = 1 to Len( cBlock )
cResultado += Str( Asc( SubStr( cBlock, n, 1 ) ) + ","
next

return cResultado
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 35350
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Lectura de puertos seriales..

Postby Busmatic_wpb » Sat Feb 03, 2018 8:15 pm

Muy estimado .
Gracias por contestar pero el asunto no vine por ahi.
El asunto es que al enviar se ve que parpadea el TXD del convertidor en el envio, pero por alguna razon el server no retorna nada porque no veo ninguna replica en la luz con convertidor RXD.

http://www.busmaticcr.com/pantalla2.bmp

Este fue el retorno que veo con la funtion que me enviaste .

Por otro lado te comento, estoy accesando este server via 485.. por USB, es decir que puse un convertidor de USB a 485 y trabaja bien.

Mi pregunta es aparte de este comando "02 30 30 30 31 31 33 30 30 31 34 03" y por ser de tipo 485 habra que incluir algun comando de retorno o algo mas podria ser.
Segun el fabricante no, pero como padras ver aqui http://www.busmaticcr.com/pantalla.bmp no hay nada mas abajo en SEND, olo incluya y no se vea en la transmision.

Porque he bajado 10 utilidades de manejo de puertos y 6 de esos trabajan bien , 4 se comportaron igual mi programa no retorna, Sacando conclusiones por 6 si y cuatro no funcionan muy profunda esta deduccion..

Por eso me pregunto habra algo mas que no hemos puesto aparte del commando que este tipo de protocolo utiliza ?? , habra que agregar de masalgun comando antes o despues ??

Gracias .. Antonio.
Busmatic_wpb
 
Posts: 74
Joined: Wed Feb 22, 2017 2:19 am

Re: Lectura de puertos seriales..

Postby Antonio Linares » Tue Feb 06, 2018 7:05 am

Prueba a añadir al final Chr( 13 ) ó Chr( 13 ) + Chr( 10 ) ó Chr( 10 )
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 35350
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Lectura de puertos seriales Solucionado.. gracias

Postby Busmatic_wpb » Tue Feb 06, 2018 11:02 pm

Muy Estimado Antonio.
Diego Decandia.

Gracias Muchas gracias

Hemos logrado despues de algunos dolores de cabeza conectarnos a un periferico RS485 por medio del un puerto COM XXX donde pasamos muchas horas leyendo y tomando notas de todas las publicaciones de los listeros que se sumaron como siempre El senor Antonio su invaluable aporte y ayuda. :wink: 8)

Agradezo de corazon y POSTEO la rutina.

#include "FiveWin.ch"

#define BUFF_IN 1024
#define BUFF_OUT 128
#define GENERIC_READ 0x80000000
#define GENERIC_WRITE 0x40000000
#define OPEN_EXISTING 3
#define FILE_ATTRIBUTE_NORMAL 0x00000080

#define NOPARITY 0
#define ODDPARITY 1
#define EVENPARITY 2
#define MARKPARITY 3
#define SPACEPARITY 4
#define ONESTOPBIT 0
#define ONE5STOPBITS 1
#define TWOSTOPBITS 2


FUNCTION LeePuerto485()

LOCAL nComm, cBloque

Public cResultado := "" ,nByteslargo ,cTrIngPuerta001 ,cTrIngPuerta002

cTrIngPuerta001:= Chr( 0x02 ) + Chr( 0x30 ) + Chr( 0x30 ) + Chr( 0x30 ) + Chr( 0x31 ) + Chr( 0x31 ) + Chr( 0x33 ) + Chr( 0x30 ) + Chr( 0x30 ) + Chr( 0x31 ) + Chr( 0x34 ) + Chr( 0x03 )


nComm := AbrePuertoCom1( "2" ) /* COM2*/

cBloque := LeePuertoCom1( nComm,128 )

CloseComm( nComm )

Return Val( SubStr( cBloque,1,7 ) )


STATIC FUNCTION AbrePuertoCom1( cPuerto )

LOCAL cDcb, nError
Local nBauds := 9600, nParity := "N", nDataByt := 8, lIRmode := .f.
Local nStopBits := ONE5STOPBITS

/*De las formas que trate encontre esta manera configurar el puerto y me funciono
"COM1" ,9600, N, 8, 1, .F.
*/

nComm := OpenComm( "COM" + cPuerto ,nBauds, nParity, nDataByt, nStopBits, lIRmode)

If nComm <= 0
nError := GetCommError( nComm )
MsgInfo( "Error al abrir puerto: " + Str( nError ) )
EndIf

If ! BuildCommDcb( "COM" + cPuerto + ":9600,N,8,1" , @cDcb )
nError := GetCommError( nComm )
MsgInfo( "Error al Configurar puerto: " + Str( nError ) )
Return 0
EndIf



If ! SetCommState( nComm, cDcb )
nError := GetCommError( nComm )
MsgInfo( "Error al setear Puerto: " + Str( nError ) )
Return 0
EndIf

Return nComm

////////////////////////////////////////////////////////////////////////////////
STATIC FUNCTION LeePuertoCom1( nComm,n )

LOCAL cBloque := Space( 50), bcc1, i :=1, nWBytes, c

cTrIngPuerta001:= Chr( 0x02 ) + Chr( 0x30 ) + Chr( 0x30 ) + Chr( 0x30 ) + Chr( 0x31 ) + Chr( 0x31 ) + Chr( 0x33 ) + Chr( 0x30 ) + Chr( 0x30 ) + Chr( 0x31 ) + Chr( 0x34 ) + Chr( 0x03 )

/* De suma importancia que el largo de la cadena sea de acorde */

nByteslargo:= Len( cTrIngPuerta001 )


If ( nWBytes := WriteComm( nComm,cTrIngPuerta001,nByteslargo ) ) <= 0
MsgStop( "Error al enviar datos la Puerto 485","Error" )
Return " "
EndIf


Sleep(100) /* Tiempo de espera para lectura del bufer, es importante esto por dos Razones.
1 Dependiendo del largo del string de retorno asi se calculara el tiempo de espera.
2 Si no lo pones no les das tiempo a Envio de informacion TX de leer el buffer completo
Asi si el bloque de datos no sale completo solo incrementa el tiempo del sleep(000)
*/

nBytes := ReadComm( nComm, @cBloque )

?? @cBloque

Return cBloque
Busmatic_wpb
 
Posts: 74
Joined: Wed Feb 22, 2017 2:19 am


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 4 guests

cron