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.
BuildCommDCB
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
BuildCommDcb()
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?.
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?.
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
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
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()
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
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