2009-11-08 19 views
6

Tengo un hilo de autodetección que intenta abrir los puertos en orden y hacer coincidir los datos recibidos, detectando así el puerto donde el dispositivo pertinente envía los datos. Ahora, hay algunos puertos donde SerialPort.Open simplemente cuelga el hilo durante ~ 30 segundos. ¿Cómo puedo establecer un tiempo de espera en la función SerialPort.Open?C#: Tiempo de espera en SerialPort.Open?

+1

¿Está iterando sobre los puertos serie de GetPortNames (http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.getportnames.aspx) o simplemente está tratando de abrir COM1, COM2, etc. – SwDevMan81

+0

Tiene el mismo problema. ¿Has resuelto esto mientras tanto? Cheers – tamberg

+0

Estoy teniendo el mismo problema. Sería bueno si hubiera una propiedad 'OpenTimeout'. –

Respuesta

1

Añadir esta en el código:

commPort = new SerialPort(); 

commPort.ReadTimeout = 1000000; 
commPort.WriteTimeout = 1000000; 

y sugiero que veas SerialPort.Open Method

+0

ya hecho ... – gdario

+0

Ok, espero que esto ayude a otro;) –

+0

¿por qué no 'SerialPort.InfiniteTimeout' entonces –

1

Si he entendido bien, que desea leer datos desde el puerto serie se produjo incluso después de tiempo de espera.

Si es así, entonces debería atrapar el TimeoutException y continuar su ciclo. p.ej. MSDN CODE

public static void Read() 
{ 
    while (_continue) 
    { 
     try 
     { 
      string message = _serialPort.ReadLine(); 
      Console.WriteLine(message); 
     } 
     catch (TimeoutException) { } 
    } 
} 
+0

Parece que no entiendes. "SerialPort.Open simplemente cuelga el hilo durante ~ 30 segundos". Este es el problema – gdario

+0

lo siento, ¿debo eliminar esta respuesta? –

+0

No, será útil para otra persona. – gdario

3

De MSDN
Sólo una conexión abierta puede existir por objeto SerialPort.

La mejor práctica para cualquier aplicación es esperar una cierta cantidad de tiempo después de llamar al método Close antes de intentar llamar al método Open, ya que el puerto puede no cerrarse al instante.

Cuando llama a Cerrar(), este subproceso de trabajo necesita tiempo para girar hacia abajo y salir. La cantidad de tiempo necesaria no está especificada y no puede verificar que se haya realizado. Todo lo que puede hacer es esperar al menos un segundo antes de volver a llamar a Abrir().

+0

+1 a la parte sobre tomarse el tiempo para abrir SerialPort después de cerrarlo. Eso me ayudó a mejorar un poco el código. – Yetti

2

Me encontré con el mismo problema y espero que mi solución pueda ayudarlo.

Puede detectar los puertos serie en una secuencia separada, que será cancelada en 500 ms.

// the Serial Port detection routine 
private void testSerialPort(object obj) 
{ 
    if (! (obj is string)) 
     return; 
    string spName = obj as string; 
    SerialPort sp = new SerialPort(spName); 

    try 
    { 
     sp.Open(); 
    } 
    catch (Exception) 
    { 
     // users don't want to experience this 
     return; 
    } 

    if (sp.IsOpen) 
    { 
     if (You can recieve the data you neeed) 
     { 
      isSerialPortValid = true; 
     } 
    } 
    sp.Close(); 

} 

// validity of serial port   
private bool isSerialPortValid; 

// the callback function of button checks the serial ports 
private void btCheck(object sender, RoutedEventArgs e) 
{ 
    foreach (string s in SerialPort.GetPortNames()) 
    { 
     isSpValid = false; 
     Thread t = new Thread(new ParameterizedThreadStart(testSerialPort)); 
     t.Start(s); 
     Thread.Sleep(500); // wait and trink a tee for 500 ms 
     t.Abort(); 

     // check wether the port was successfully opened 
     if (isSpValid) 
     { 
      textBlock1.Text = "Serial Port " + s + " is OK !"; 
     } 
     else 
     { 
      textBlock1.Text = "Serial Port " + s + " retards !"; 
     } 
     } 
    } 
} 

Posibles mejoras podrían agregarse a la solución. Puede usar múltiples hilos para acelerar el proceso y usar ProgressBar para mostrar el progreso con claridad.