Page 1 of 1

BuildCommDCB

Posted: Thu Jan 17, 2008 9:35 am
by Verhoven
El problema que tengo con la funcion BuildCommDCB es que no configura el puerto com del PC. La utilizo de la siguiente manera:

nComHandle:=OpenCom("COM4",1024,1024)
BuildCommDcb("COM4:9600,N,8,1", @cDcb)

Para configurarlo tengo que irme al MS-DOS y hacer lo siguiente:
MODE COM4 9600,N,8,1
Alguien me puede decir qué puede estar pasando o qué hago mal.

Gracias.

Posted: Thu Jan 17, 2008 10:00 am
by Antonio Linares
Verhoven,

Haz una búsqueda de BuildCommDCB() en los *.PRG de fwh\samples y verás como hay que usarlo

BuildCommDcb()

Posted: Thu Jan 17, 2008 3:02 pm
by Verhoven
Gracias por contestar Antonio, he probado ya de todo y en varios ordenadores a ver si es que se tratara de un fallo por estar usando un puerto COM creado a través de uno USB con un cable conversor USB-RS-232. Pero NO.

El problema es que la funcion BuildCommDCB no configura el puerto a lo que dice que lo hace.

El puerto originalmente esta configurado como 1200,N,7,1 y lo tengo que cambiar a 9600,N,8,1 para poderme comunicar con el dispositivo y esto es lo que no hace BuildCommDcb.

Cuando lo hago desde la consola de MS-DOS del W-XP con el comando MODE COM4 9600,N,8,1 si deja bien configurado el puerto y me conunico correctamente hacia y desde el dispositivo con mi programa, pero como antes no haga esto no hay forma.

He probado el \samples\Commtest.prg y aunque en el archivo log que genera dice que todo está correcto la verdad es que no. De hecho le he puesto que cuando llega a la opcion COM4 9600 N 8 1 mande un mensaje al puerto, para probar si el dispositivo conectado lo reconoce y que por lo tanto lo ha configurado bien y me da un error en el dispositivo porque en realidad no ha modificado la configuracion del puerto que sigue estando en 1200,N,7,1. Configuración que compruebo haciendo en la consola de MS-DOS MODE COM4 que, como sabes, lista la configuracion del mismo.

¿Qué más puedo probar?.

Posted: Thu Jan 17, 2008 7:01 pm
by Antonio Linares
Verhoven,

En realidad BuildCommDcb() solo rellena la información de una esctructura "DCB". En realidad la función que aplica esos valores es:

SetCommState()

y aqui es donde está la diferencia con los 16 bits. En Clipper se usa así:
SetCommState( cDcb ), pero en 32 bits se usa así: SetCommState( nComm, cDcb ) en donde nComm es el valor devuelto por OpenComm().

Pruébalo :-)

SetCommState()

Posted: Thu Jan 17, 2008 9:36 pm
by Verhoven
Antonio he probado pero sigue igual. Te pongo el trozo de codigo para que puedas ver exactamente como lo hago:

function Prueba()
local lPortReady:=.f.
local nBytes :=0
local nError :=0
local cTexto :='Prueba escritura RS-232'

local cPort:='4', cSpeed:='9600'
local cDcb, cRv := '', cS := 'COM' + cPort + ':' + cSpeed + ',n,8,1'

// Abre el puerto en el PC.
nComm := OpenComm( 'COM' + cPort, 1024 , 128 )

IF nComm >= 0 // We have a valid port...
msginfo(' Se ha abierto el puerto: COM' + cPort)
IF BuildCommDcb( cS, @cDcb ) // Set Speed, etc
IF SetCommState( nComm, cDcb )
cRv := ''
msginfo('SetCommState CORRECTO: '+cs)
lPortReady:=.t.
ELSE
cRv := 'Failed to SetCommState on COM' + cPort + ' at ' + cSpeed
ENDIF
ELSE
cRv := 'Failed to BuildCommDCB on COM' + cPort + ' at ' + cSpeed
ENDIF
ELSE
cRv := 'Failed to find COM' + cPort
ENDIF

if ! lPortReady
nError = GetCommError( nComm )
MsgInfo( cRv )
endif

// Escribe en el puerto COM
if ( nBytes := WriteComm( nComm, cTexto ) ) < 0
nError = GetCommError( nComm )
MsgInfo( cCom+", WriteComm Error: " + Str( nError ),'Error' )
endif

//Limpia el buffer del puerto
if FlushComm( nComm, 0 ) != 0
nError = GetCommError( nComm )
MsgInfo( cCom+", FlushComm Error: " + Str( nError ) )
endif

// Cierra el puerto
CloseComm( nComm )
return nil