Page 1 of 1

Lectura de puertos seriales..

PostPosted: Tue Jan 30, 2018 11:36 pm
by Busmatic_wpb
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

Re: Lectura de puertos seriales..

PostPosted: Wed Jan 31, 2018 6:21 pm
by karinha
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.

Re: Lectura de puertos seriales..

PostPosted: Thu Feb 01, 2018 1:03 am
by Busmatic_wpb
Karina Gracias.
No te agradezco tu respuesta pero ando buscando el problema de WriteComm que no me funciona.
Gracias

Re: Lectura de puertos seriales..

PostPosted: Thu Feb 01, 2018 11:49 am
by Antonio Linares
Oscar,

Que valor recibe BitesSend ?

Re: Lectura de puertos seriales..

PostPosted: Sat Feb 03, 2018 1:59 am
by Busmatic_wpb
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

Re: Lectura de puertos seriales..

PostPosted: Sat Feb 03, 2018 3:08 am
by Busmatic_wpb
Perdon Estimado, el BitesSend retorna 36 el largo de la cadena que se envia
Gracias .

Re: Lectura de puertos seriales..

PostPosted: Sat Feb 03, 2018 5:38 am
by Antonio Linares
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

Re: Lectura de puertos seriales..

PostPosted: Sat Feb 03, 2018 8:15 pm
by Busmatic_wpb
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.

Re: Lectura de puertos seriales..

PostPosted: Tue Feb 06, 2018 7:05 am
by Antonio Linares
Prueba a añadir al final Chr( 13 ) ó Chr( 13 ) + Chr( 10 ) ó Chr( 10 )

Lectura de puertos seriales Solucionado.. gracias

PostPosted: Tue Feb 06, 2018 11:02 pm
by Busmatic_wpb
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