FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour LEER PUERTO SERIAL VIA RDP / SOLUCIONADO PARA LOCAL Y REMOTO
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
Posted: Wed Feb 08, 2017 07:55 AM
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
Posted: Wed Feb 08, 2017 08:09 AM

Hay que buscar en google por remote desktop y readfile

la funci贸n de Windows que parece fallar es ReadFile

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
Posted: Wed Feb 08, 2017 08:13 AM

la funci贸n ReadComm() de FWH usa un thread

tal vez ese thread no se activa al usar el remote desktop

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
Posted: Wed Feb 08, 2017 10:56 AM
Modifica esta funci贸n en FWH\source\winapi\comm.c

Vamos a comprobar si el thread se crea correctamente:

Code (fw): Select all Collapse
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;
}
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
Posted: Wed Feb 08, 2017 10:59 AM

M谩s sencillo:

Comprueba el valor que devuelve OpenComm()

un valor -1 es error

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 411
Joined: Sun Jan 31, 2010 03:30 PM
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
Posted: Thu Feb 09, 2017 11:20 PM

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

Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
Posted: Fri Feb 10, 2017 07:58 AM
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:

Code (fw): Select all Collapse
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
   }
}
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 411
Joined: Sun Jan 31, 2010 03:30 PM
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
Posted: Fri Feb 10, 2017 11:49 PM

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

Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
Posted: Sat Feb 11, 2017 06:15 AM

> y si incluyo el comm.c // me genera un error

Que error es ?

Puedes probar tu aplicaci贸n con Harbour 贸 xHarbour libre ?

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 411
Joined: Sun Jan 31, 2010 03:30 PM
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
Posted: Sat Feb 11, 2017 12:02 PM
Para pruebas uso este build para xharbour de la carpera fwh\samples...

como el incluyo el archivo en c


Code (fw): Select all Collapse
@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: 411
Joined: Sun Jan 31, 2010 03:30 PM
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
Posted: Sun Feb 12, 2017 03:41 PM

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 *

Posts: 411
Joined: Sun Jan 31, 2010 03:30 PM
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
Posted: Sun Feb 12, 2017 08:35 PM
Antonio...

Inclu铆 el comm.cc dentro de un prg y ya me compila. obtengo estos resultados
Code (fw): Select all Collapse
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: 411
Joined: Sun Jan 31, 2010 03:30 PM
Re: LEER PUERTO SERIAL VIA RDP / SOLUCIONADO PARA LOCAL Y REMOTO
Posted: Sun Feb 12, 2017 11:25 PM
Antonio...

Lo solucione asi : Sleep(10);

1. Modificacion de comm.c :
Code (fw): Select all Collapse
聽 聽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


Gracias por su valiosa colaboraci贸n
// favor incluir ese peque帽o detalle en las lib de fivewin (xharbour.com)
Posts: 728
Joined: Fri Oct 07, 2005 07:38 AM
Re: LEER PUERTO SERIAL VIA RDP / SOLUCIONADO PARA LOCAL Y REMOTO
Posted: Wed Mar 29, 2017 07:18 AM
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!

russimicro wrote:Antonio...

Lo solucione asi : Sleep(10);

1. Modificacion de comm.c :
Code (fw): Select all Collapse
聽 聽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


Gracias por su valiosa colaboraci贸n
// favor incluir ese peque帽o detalle en las lib de fivewin (xharbour.com)
Angel Salom
Visionwin Software - https://www.visionwin.com
------------------------------------------------------------
fwh 19.05 - harbour 3.2 - bcc 7.4

Continue the discussion