Ver Mensaje Individual
  #4  
Antiguo 17-08-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Reputación: 24
seoane Va por buen camino
Ignoro como funciona el componente que mencionas, pero me surge una pregunta, ¿por que no utilizas la API para leer el puerto serie?. Windows dispone de las funciones necesarias para leer el puerto serie de manera sencilla, los componentes lo único que hacen es llamar a esas mismas funciones, pero además incluyen un montón de código a mayores, que a veces en vez de ayudar es una molestia.

¿Que es lo que necesitas exactamente?, es decir, si tienes que leer byte a byte e ir procesando cada uno por separado un simple bucle sera mucho mas rápido que cualquier componente que funcione con eventos. Si no quieres tener tu aplicación congelada mientras ejecutas el bucle, utiliza threads, de esta manera la lectura se realizara en paralelo con hilo principal de tu programa. Un simple loop dentro de un thread es el método mas rápido que existe para leer los bytes, eso te lo garantizo.

Por ejemplo:
Código Delphi [-]
var
  hPort: THandle;
  DCB: TDCB;
  Estado: TCOMSTAT;
  ErrorCode: cardinal;
  Leidos: Cardinal;
  B: Byte;
begin
  // Para el COM2 usa '\\.\COM2'
  hPort:= CreateFile(PChar('\\.\COM1'), GENERIC_READ or GENERIC_WRITE,0, nil,
    OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
  if hPort<>INVALID_HANDLE_VALUE then
  begin
    DCB.DCBlength:= sizeof(DCB);
    if GetCommState(hPort,DCB) then
    begin
      // Cambiar esto para una configuracion del puerto diferente
      with DCB do
      begin
        BaudRate := CBR_9600;
        ByteSize := 8;
        Parity   := NOPARITY;
        StopBits := ONESTOPBIT;
        // Aqui es donde indicamos que active RTS y DTR
        Flags    := $1013;
      end;
      if SetCommState(hPort, DCB) then
      begin
        // Vaciamos el Buffer
        PurgeComm(hPort, PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or
          PURGE_RXCLEAR);
        repeat
          B:= 1;
          ClearCommError(hPort, ErrorCode, @Estado);
          if Estado.cbInQue > 0 then
          begin
            ReadFile(hPort,B,1,Leidos,nil);
            // Aqui usa el valor de B para lo que quieras
          end else Sleep(100);
          // Si no hay bytes esperando dormimos un poco para no estresarnos
        until B = 0;
        // Terminamos el bucle cuando recibimos un 0, tu ajustalo a tus necesidades
      end;
    end;
    CloseHandle(hPort);
  end;
end;

Aunque si vas a leer una gran cantidad de bytes te recomiendo que metas el código dentro de un Thread, para no tener la aplicación parada.

Última edición por seoane fecha: 17-08-2006 a las 21:17:05.
Responder Con Cita