LEER PUERTO SERIAL VIA RDP / SOLUCIONADO PARA LOCAL Y REMOTO
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
Hay que buscar en google por remote desktop y readfile
la función de Windows que parece fallar es ReadFile
la función de Windows que parece fallar es ReadFile
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
la función ReadComm() de FWH usa un thread
tal vez ese thread no se activa al usar el remote desktop
tal vez ese thread no se activa al usar el remote desktop
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
Modifica esta función en FWH\source\winapi\comm.c
Vamos a comprobar si el thread se crea correctamente:
Vamos a comprobar si el thread se crea correctamente:
Code: Select all
LPCOMDATA OpenComm( LPCSTR lpszDevControl, unsigned short int cbInQueue,
unsigned short int cbOutQueue )
{
LPCOMDATA pComm = ( LPCOMDATA ) hb_xgrab( sizeof( COMDATA ) );
memset( ( char * ) pComm, 0, sizeof ( COMDATA ) );
pComm->hCom = CreateFile( lpszDevControl,
GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL );
SetupComm( pComm->hCom, cbInQueue, cbOutQueue );
SetCommMask( pComm->hCom, EV_RXCHAR );
EscapeCommFunction( pComm->hCom, SETDTR );
pComm->hThread = CreateThread( NULL, 0, listenThread, pComm, 0, &pComm->dwThreadID );
if( pComm->hThread == 0 )
{
MessageBox( 0, "error", "error", 0 ); // nuevo !!!
CloseHandle( pComm->hCom );
hb_xfree( ( void * ) pComm );
return ( LPCOMDATA ) -1;
}
return pComm;
}
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
Más sencillo:
Comprueba el valor que devuelve OpenComm()
un valor -1 es error
Comprueba el valor que devuelve OpenComm()
un valor -1 es error
-
- Posts: 179
- Joined: Sun Jan 31, 2010 3:30 pm
- Location: Bucaramanga - Colombia
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
Antonio ... Buena tarde
El retorno es mayor a cero ...
local nComm := OpenComm( "COM5", 1024, 128 )
ALERTA(nComm) // 65007860.00
if ! BuildCommDcb( "COM5:9600,n,8,1", @cDcb )
MsgStop( "Error BUILD!" )
return .f.
endif
El retorno es mayor a cero ...
local nComm := OpenComm( "COM5", 1024, 128 )
ALERTA(nComm) // 65007860.00
if ! BuildCommDcb( "COM5:9600,n,8,1", @cDcb )
MsgStop( "Error BUILD!" )
return .f.
endif
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
Eso quiere decir que el thread se ha creado
ahora vamos a comprobar si funciona correctamente. En source\winapi\comm.c haz esta modificación y
comprueba al ejecutar la aplicación si aparece este mensaje:
ahora vamos a comprobar si funciona correctamente. En source\winapi\comm.c haz esta modificación y
comprueba al ejecutar la aplicación si aparece este mensaje:
Code: Select all
static DWORD __stdcall listenThread( LPVOID pVoid )
{
char buf[ 1024 ];
DWORD dwBytesReaded, event;
COMSTAT stat;
OVERLAPPED overlap; // A.L. 2007, Keep this here!!! Not on the struct!!!
LPCOMDATA pComm = ( LPCOMDATA ) pVoid;
SetCommMask( pComm->hCom, EV_RXCHAR );
memset( ( char * ) &overlap, 0, sizeof ( overlap ) );
while( 1 )
{
DWORD x;
WaitCommEvent( pComm->hCom, &event, NULL );
ClearCommError( pComm->hCom, &event, &stat );
ReadFile( pComm->hCom, buf, min( 1023, stat.cbInQue ), &dwBytesReaded, &overlap );
GetOverlappedResult( pComm->hCom, &overlap, &dwBytesReaded, FALSE );
buf[ dwBytesReaded + 1 ] = 0;
for( x = 0; x < dwBytesReaded; x++ )
{
pComm->combuf[ pComm->comheadbuf ] = buf[ x ];
pComm->comheadbuf++;
if( pComm->comheadbuf > COMBUFSIZE - 1 )
pComm->comheadbuf = 0;
}
if( pComm->CommNotifyHwnd != NULL )
{ // nuevo
SendMessage( pComm->CommNotifyHwnd, WM_COMMNOTIFY, ( WPARAM ) pComm,
MAKELONG( CN_RECEIVE, 0 ) );
MessageBox( 0, "mensaje enviado", "ok", 0 ); // nuevo
} // nuevo
}
}
-
- Posts: 179
- Joined: Sun Jan 31, 2010 3:30 pm
- Location: Bucaramanga - Colombia
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
Recompilo las fuentes con xharbour.com pero no veo el cambio,
debo un incluir un prg en especial ??
y si incluyo el comm.c // me genera un error
debo un incluir un prg en especial ??
y si incluyo el comm.c // me genera un error
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
> y si incluyo el comm.c // me genera un error
Que error es ?
Puedes probar tu aplicación con Harbour ó xHarbour libre ?
Que error es ?
Puedes probar tu aplicación con Harbour ó xHarbour libre ?
-
- Posts: 179
- Joined: Sun Jan 31, 2010 3:30 pm
- Location: Bucaramanga - Colombia
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
Para pruebas uso este build para xharbour de la carpera fwh\samples...
como el incluyo el archivo en c
como el incluyo el archivo en c
Code: Select all
@ECHO OFF
CLS
ECHO ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
ECHO ³ FiveWin for xHarbour 15.01 - Jan. 2015 xHarbour development power ³Ü
ECHO ³ (c) FiveTech, 1993-2015 for Microsoft Windows 9X/NT/200X/ME/XP/Vista/7/8 ³Û
ECHO ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙÛ
ECHO ÿ ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
if A%1 == A GOTO :SINTAX
if NOT EXIST %1.prg GOTO :NOEXIST
ECHO Compiling...
if "%FWDIR%" == "" set FWDIR=.\..\
if "%XHDIR%" == "" set XHDIR=c:\xharbour
rem if "%2" == "/b" set GT=gtwin
rem if not "%2" == "/b" set GT=gtgui
set GT=gtgui
set hdir=%XHDIR%
set hdirl=%hdir%\lib
set bcdir=c:\bcc582
set fwh=%FWDIR%
%hdir%\bin\harbour %1 /n /i%fwh%\include;%hdir%\include /w /p %2 %3 > comp.log 2> warnings.log
IF ERRORLEVEL 1 GOTO COMPILEERRORS
@type comp.log
@type warnings.log
echo -O2 -e%1.exe -I%hdir%\include -I%bcdir%\include %1.c > b32.bc
%bcdir%\bin\bcc32 -M -c -v @b32.bc
:ENDCOMPILE
IF EXIST %1.rc %bcdir%\bin\brc32 -r -I%bcdir%\include %1
echo %bcdir%\lib\c0w32.obj + > b32.bc
echo %1.obj, + >> b32.bc
echo %1.exe, + >> b32.bc
echo %1.map, + >> b32.bc
echo %fwh%\lib\Fivehx.lib %fwh%\lib\FiveHC.lib + >> b32.bc
echo %hdirl%\rtl.lib + >> b32.bc
echo %hdirl%\vm.lib + >> b32.bc
echo %hdirl%\%GT%.lib + >> b32.bc
echo %hdirl%\lang.lib + >> b32.bc
echo %hdirl%\macro.lib + >> b32.bc
echo %hdirl%\rdd.lib + >> b32.bc
echo %hdirl%\dbfntx.lib + >> b32.bc
echo %hdirl%\dbfcdx.lib + >> b32.bc
echo %hdirl%\dbffpt.lib + >> b32.bc
echo %hdirl%\hbsix.lib + >> b32.bc
echo %hdirl%\debug.lib + >> b32.bc
echo %hdirl%\common.lib + >> b32.bc
echo %hdirl%\pp.lib + >> b32.bc
echo %hdirl%\pcrepos.lib + >> b32.bc
echo %hdirl%\ct.lib + >> b32.bc
echo %hdirl%\zlib.lib + >> b32.bc
echo %hdirl%\hbzip.lib + >> b32.bc
echo %hdirl%\libmisc.lib + >> b32.bc
echo %hdirl%\tip.lib + >> b32.bc
echo %hdirl%\png.lib + >> b32.bc
rem Uncomment these two lines to use Advantage RDD
rem echo %hdir%\lib\rddads.lib + >> b32.bc
rem echo %hdir%\lib\Ace32.lib + >> b32.bc
echo %bcdir%\lib\cw32.lib + >> b32.bc
echo %bcdir%\lib\import32.lib + >> b32.bc
echo %bcdir%\lib\uuid.lib + >> b32.bc
echo %bcdir%\lib\ws2_32.lib + >> b32.bc
echo %bcdir%\lib\psdk\odbc32.lib + >> b32.bc
echo %bcdir%\lib\psdk\rasapi32.lib + >> b32.bc
echo %bcdir%\lib\psdk\nddeapi.lib + >> b32.bc
echo %bcdir%\lib\psdk\msimg32.lib + >> b32.bc
echo %bcdir%\lib\psdk\psapi.lib + >> b32.bc
echo %bcdir%\lib\psdk\gdiplus.lib + >> b32.bc
echo %bcdir%\lib\psdk\iphlpapi.lib + >> b32.bc
echo %bcdir%\lib\psdk\shell32.lib, >> b32.bc
IF EXIST %1.res echo %1.res >> b32.bc
rem uncomment this line to use the debugger and comment the following one
if %GT% == gtwin %bcdir%\bin\ilink32 -Gn -Tpe -s -v @b32.bc
IF ERRORLEVEL 1 GOTO LINKERROR
if %GT% == gtgui %bcdir%\bin\ilink32 -Gn -aa -Tpe -s -v @b32.bc
IF ERRORLEVEL 1 GOTO LINKERROR
ECHO * Application successfully built *
%1
GOTO EXIT
ECHO
rem delete temporary files
@del %1.c
:COMPILEERRORS
@type comp.log
ECHO * Compile errors *
GOTO EXIT
:LINKERROR
ECHO * Linking errors *
GOTO EXIT
:SINTAX
ECHO SYNTAX: Build [Program] {-- No especifiques la extensi¢n PRG
ECHO {-- Don't specify .PRG extension
GOTO EXIT
:NOEXIST
ECHO The specified PRG %1 does not exist
:EXIT
-
- Posts: 179
- Joined: Sun Jan 31, 2010 3:30 pm
- Location: Bucaramanga - Colombia
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
modifique el build asi :
%bcdir%\bin\bcc32 -c -X -O2 %fwh%\source\winapi\comm.c
echo %bcdir%\lib\c0w32.obj comm.obj, + > b32.bc
///*************** Resultado
Compiling...
xHarbour Compiler build 1.2.1 (SimpLex) (Rev. 6406)
Copyright 1999-2009, http://www.xharbour.org http://www.harbour-project.org/
Compiling 'testserial.prg' and generating preprocessed output to 'testserial.ppo'...
Lines 86, Functions/Procedures 3
Generating C source output to 'testserial.c'...
Done.
Borland C++ 5.82 for Win32 Copyright (c) 1993, 2005 Borland
testserial.c:
Borland C++ 5.82 for Win32 Copyright (c) 1993, 2005 Borland
.\..\\source\winapi\comm.c:
Warning W8065 .\..\\source\winapi\comm.c 47: Call to function 'HB_ISNUM' with no prototype in function HB_FUN_OPENCOMM
Warning W8065 .\..\\source\winapi\comm.c 48: Call to function 'HB_ISNUM' with no prototype in function HB_FUN_OPENCOMM
Warning W8012 .\..\\source\winapi\comm.c 333: Comparing signed and unsigned values in function ReadComm
Warning W8019 .\..\\source\winapi\comm.c 334: Code has no effect in function ReadComm
Turbo Incremental Link 5.69 Copyright (c) 1997-2005 Borland
Fatal: Too many DEF file names: .\..\\lib\FiveHC.lib
* Linking errors *
%bcdir%\bin\bcc32 -c -X -O2 %fwh%\source\winapi\comm.c
echo %bcdir%\lib\c0w32.obj comm.obj, + > b32.bc
///*************** Resultado
Compiling...
xHarbour Compiler build 1.2.1 (SimpLex) (Rev. 6406)
Copyright 1999-2009, http://www.xharbour.org http://www.harbour-project.org/
Compiling 'testserial.prg' and generating preprocessed output to 'testserial.ppo'...
Lines 86, Functions/Procedures 3
Generating C source output to 'testserial.c'...
Done.
Borland C++ 5.82 for Win32 Copyright (c) 1993, 2005 Borland
testserial.c:
Borland C++ 5.82 for Win32 Copyright (c) 1993, 2005 Borland
.\..\\source\winapi\comm.c:
Warning W8065 .\..\\source\winapi\comm.c 47: Call to function 'HB_ISNUM' with no prototype in function HB_FUN_OPENCOMM
Warning W8065 .\..\\source\winapi\comm.c 48: Call to function 'HB_ISNUM' with no prototype in function HB_FUN_OPENCOMM
Warning W8012 .\..\\source\winapi\comm.c 333: Comparing signed and unsigned values in function ReadComm
Warning W8019 .\..\\source\winapi\comm.c 334: Code has no effect in function ReadComm
Turbo Incremental Link 5.69 Copyright (c) 1997-2005 Borland
Fatal: Too many DEF file names: .\..\\lib\FiveHC.lib
* Linking errors *
-
- Posts: 179
- Joined: Sun Jan 31, 2010 3:30 pm
- Location: Bucaramanga - Colombia
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
Antonio...
Incluí el comm.cc dentro de un prg y ya me compila. obtengo estos resultados
Incluí el comm.cc dentro de un prg y ya me compila. obtengo estos resultados
Code: Select all
1. if( pComm->CommNotifyHwnd != NULL )
SendMessage( pComm->CommNotifyHwnd, WM_COMMNOTIFY, ( WPARAM ) pComm,
MAKELONG( CN_RECEIVE, 0 ) );
MessageBox( 0, "mensaje enviado", "ok", 0 ); // nuevo ... despliega este mensaje , tanto en local como en el remoto
2. ReadFile( pComm->hCom, buf, min( 1023, stat.cbInQue ), &dwBytesReaded, &overlap );
GetOverlappedResult( pComm->hCom, &overlap, &dwBytesReaded, FALSE );
MessageBox( 0, buf , "contenido de buf", 0 ); // ver contenido de buf
en modo local -> buf = 0.145
0.145 ....
en modo remoto -> buf = 0
0
....
4
0
5
0
....
1 -> irregular el retorno
3. for( x = 0; x < dwBytesReaded ; x++ )
{
MessageBox( 0, "entro for" , "contenido de buf", 0 ); // en modo local si entra... en modo remoto no => dwBytesReaded es cero ???
pComm->combuf[ pComm->comheadbuf ] = buf[ x ];
pComm->comheadbuf++;
if( pComm->comheadbuf > COMBUFSIZE - 1 )
pComm->comheadbuf = 0;
}
-
- Posts: 179
- Joined: Sun Jan 31, 2010 3:30 pm
- Location: Bucaramanga - Colombia
Re: LEER PUERTO SERIAL VIA RDP / SOLUCIONADO PARA LOCAL Y REMOTO
Antonio...
Lo solucione asi : Sleep(10);
1. Modificacion de comm.c :
Gracias por su valiosa colaboración
// favor incluir ese pequeño detalle en las lib de fivewin (xharbour.com)
Lo solucione asi : Sleep(10);
1. Modificacion de comm.c :
Code: Select all
while( 1 )
{
DWORD x;
WaitCommEvent( pComm->hCom, &event, NULL );
ClearCommError( pComm->hCom, &event, &stat );
Sleep(10); // agregue este tiempo de espera
ReadFile( pComm->hCom, buf, min( 1023, stat.cbInQue ), &dwBytesReaded, &overlap );
GetOverlappedResult( pComm->hCom, &overlap, &dwBytesReaded, FALSE );
buf[ dwBytesReaded + 1 ] = 0;
for( x = 0; x < dwBytesReaded ; x++ )
{
pComm->combuf[ pComm->comheadbuf ] = buf[ x ];
pComm->comheadbuf++;
if( pComm->comheadbuf > COMBUFSIZE - 1 )
pComm->comheadbuf = 0;
}
if( pComm->CommNotifyHwnd != NULL )
SendMessage( pComm->CommNotifyHwnd, WM_COMMNOTIFY, ( WPARAM ) pComm,
MAKELONG( CN_RECEIVE, 0 ) );
};
2. agregando tiempo de espera en los .prg, entre el readcomm y BuildCommDcb : MySleep(nTieEsp) ejp 10
IdPort := OpenComm("COM"+STR(nNroPue,1), 1024,128) //,2048,512
MySleep(nTieEsp) // agregue este tiempo de espera
IF ! BuildCommDcb(sarta, @cDcb)
nError = GetCommError( IdPort)
MsgInfo( "Error al Configurar: " + Str( nError ) )
BREAK
ELSE
//MsgRun("Puerto Configurado")
ENDIF
// favor incluir ese pequeño detalle en las lib de fivewin (xharbour.com)
- AngelSalom
- Posts: 664
- Joined: Fri Oct 07, 2005 7:38 am
- Location: Vinaros (Castellón ) - España
- Contact:
Re: LEER PUERTO SERIAL VIA RDP / SOLUCIONADO PARA LOCAL Y REMOTO
Hola amigos, al respecto de esta función, con la modificación del Sleep(10) me funcionó a mí también con basculas vía terminal server. Ahora bien, en función de la calidad de la conexión necesitaría poder modificar el valor de espera, ¿cómo podría pasarle un parámetro desde mi aplicación para indicarle esto?
Gracias!
Gracias!
russimicro wrote:Antonio...
Lo solucione asi : Sleep(10);
1. Modificacion de comm.c :Gracias por su valiosa colaboraciónCode: Select all
while( 1 ) { DWORD x; WaitCommEvent( pComm->hCom, &event, NULL ); ClearCommError( pComm->hCom, &event, &stat ); Sleep(10); // agregue este tiempo de espera ReadFile( pComm->hCom, buf, min( 1023, stat.cbInQue ), &dwBytesReaded, &overlap ); GetOverlappedResult( pComm->hCom, &overlap, &dwBytesReaded, FALSE ); buf[ dwBytesReaded + 1 ] = 0; for( x = 0; x < dwBytesReaded ; x++ ) { pComm->combuf[ pComm->comheadbuf ] = buf[ x ]; pComm->comheadbuf++; if( pComm->comheadbuf > COMBUFSIZE - 1 ) pComm->comheadbuf = 0; } if( pComm->CommNotifyHwnd != NULL ) SendMessage( pComm->CommNotifyHwnd, WM_COMMNOTIFY, ( WPARAM ) pComm, MAKELONG( CN_RECEIVE, 0 ) ); }; 2. agregando tiempo de espera en los .prg, entre el readcomm y BuildCommDcb : MySleep(nTieEsp) ejp 10 IdPort := OpenComm("COM"+STR(nNroPue,1), 1024,128) //,2048,512 MySleep(nTieEsp) // agregue este tiempo de espera IF ! BuildCommDcb(sarta, @cDcb) nError = GetCommError( IdPort) MsgInfo( "Error al Configurar: " + Str( nError ) ) BREAK ELSE //MsgRun("Puerto Configurado") ENDIF
// favor incluir ese pequeño detalle en las lib de fivewin (xharbour.com)
Angel Salom
http://www.visionwin.com
---------------------------------------------
fwh 19.05 - harbour 3.2 - bcc 7.0
http://www.visionwin.com
---------------------------------------------
fwh 19.05 - harbour 3.2 - bcc 7.0