SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: solarin en Jueves 24 de Agosto de 2006, 12:29

Título: Monitorizar Puerto Com1
Publicado por: solarin en Jueves 24 de Agosto de 2006, 12:29
Tengo un programa que envia (o deberia) enviar datos a traves de uno de los puertos serie.

Qual es la mejor manera de mirar si estoy realmente enviado alguna cosa? Es decir, hay alguna manera en windows de monitorizar lo que se envia por los puertos serie (COM1, COM2)?
Título: Re: Monitorizar Puerto Com1
Publicado por: Eternal Idol en Jueves 24 de Agosto de 2006, 12:44
Cita de: "solarin"
Tengo un programa que envia (o deberia) enviar datos a traves de uno de los puertos serie.

Qual es la mejor manera de mirar si estoy realmente enviado alguna cosa? Es decir, hay alguna manera en windows de monitorizar lo que se envia por los puertos serie (COM1, COM2)?
La manera mas simple seria depurarlo, poner un breakpoint en CreateFile y ver que HANDLE obtiene y despues en WriteFile para ver si logra escribir o no. La dificultad de monitorizar un puerto COM viene dada por la exclusividad del mismo: no pueden haber dos HANDLEs abiertos en todo el S.O. para un puerto COM.
Título: Re: Monitorizar Puerto Com1
Publicado por: solarin en Jueves 24 de Agosto de 2006, 12:48
el problema lo tengo con los breakpoints  :(  . No consigo depurar el programa.

los problemas:

Loaded 'D:\prj\simulador HMS\Enviar Datos al sim\CMS\Release\CMS.exe', no matching symbolic information found.
Loaded 'ntdll.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\kernel32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\mfc42.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\msvcrt.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\gdi32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\user32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\mfc42loc.dll', no matching symbolic information found.
The program 'D:\prj\simulador HMS\Enviar Datos al sim\CMS\Release\CMS.exe' has exited with code 0 (0x0).
Título: Re: Monitorizar Puerto Com1
Publicado por: Eternal Idol en Jueves 24 de Agosto de 2006, 12:49
Usa otro depurador como el WinDbg o el OllyDbg por ejemplo.
Título: Re: Monitorizar Puerto Com1
Publicado por: solarin en Jueves 24 de Agosto de 2006, 16:02
I si con la aplicacion abro el COM1, conecto un cable serie del 1 al 2. Puedo ahora mirar el dos con alguna cosilla de windows? (lo he intentado con "terminal virtual" pero no veo na..)

No he usado break points :( i al final he pasado a la marrulleria de los miss. Con esto he visto que la funcion writefile retorna lo que toca.
Título: Re: Monitorizar Puerto Com1
Publicado por: Eternal Idol en Jueves 24 de Agosto de 2006, 18:01
Cita de: "solarin"
I si con la aplicacion abro el COM1, conecto un cable serie del 1 al 2. Puedo ahora mirar el dos con alguna cosilla de windows? (lo he intentado con "terminal virtual" pero no veo na..)

No he usado break points :( i al final he pasado a la marrulleria de los miss. Con esto he visto que la funcion writefile retorna lo que toca.
Si desde el COM1 logras enviar datos al COM2 podes usar la misma tecnica para abrir el COM2 y en vez de enviar recibir.
Título: Re: Monitorizar Puerto Com1
Publicado por: solarin en Lunes 28 de Agosto de 2006, 16:27
No veo donde tengo el error:

Código: Text
  1.  
  2. void CSerialPort::ProcessTX()
  3. {
  4.    int r;
  5.    DWORD bytes_written = 0;
  6.    CBuffer bufferTx;
  7.      
  8.    CSingleLock LockTX(&mutex[TX]);
  9.  
  10.    while(comPort != INVALID_HANDLE_VALUE)
  11.    {
  12.  
  13.       LockTX.Lock();  
  14.     if(data[TX].ind > 0)
  15.     {
  16.       memcpy(&bufferTx,&data[TX],sizeof(CBuffer));
  17.           data[TX].ind = 0;
  18.       LockTX.Unlock();
  19.      
  20.       r = WriteFile (comPort, bufferTx.buffer, bufferTx.ind, &bytes_written, &overlapped[TX]);
  21.      
  22.       WaitForSingleObject (event[TX], INFINITE);
  23.      
  24.       if(bytes_written > 0)
  25.       {
  26.       logfromSerial = "write file ok \r\n";
  27.       logt=1;
  28.       }else
  29.       {
  30.         logfromSerial = "error writting in port \r\n";
  31.         logt=1;
  32.       }
  33.    
  34.     }
  35.     else
  36.     {  
  37.     LockTX.Unlock();
  38.     ResetEvent(event[TX]);
  39.     WaitForSingleObject (event[TX], 1);
  40.     }  
  41.    }
  42. }
  43.  

Pero al final bytes_written siempre es 0, es decir no escribe na de na. Ves alguna cosa rara?
Título: Re: Monitorizar Puerto Com1
Publicado por: Eternal Idol en Lunes 28 de Agosto de 2006, 16:50
Cita de: "solarin"
Pero al final bytes_written siempre es 0, es decir no escribe na de na. Ves alguna cosa rara?
Esa afirmacion que haces me hace pensar que lo raro es que uses acceso asincrono a los archivos. Que bytes_written sea cero no quiere decir nada usando este tipo de acceso que por cierto no tiene mucho sentido que uses si inmediatamente haces un WaitForSingleObject con INFINITE ya que estas finalmente haciendo sincrona la escritura. Deberias utilizar acceso sincrono pero para obtener el resultado de un acceso asincrono se usa GetOverlappedResult. Consulta la MSDN ya que esto viene mucho mejor explicado ahi http://msdn.microsoft.com (http://msdn.microsoft.com) (ver WriteFile, CreateFile, etc).