8
votes

C #: Timeout sur Serialport.open?

J'ai un fil d'autodétect qui tente d'ouvrir les ports dans l'ordre et de correspondre aux données reçues, détectant ainsi le port dans lequel le périphérique correspondant envoie les données. Maintenant, il y a des ports où le Serialport.Open accroche simplement le fil pendant environ 30 secondes. Comment puis-je définir un délai d'attente sur la fonction SerialPort.Open?


3 commentaires

Êtes-vous itération sur les ports série de GetporTnames ( msdn.microsoft.com/en-us/library/... ) Ou essayez-vous simplement d'ouvrir COM1, COM2, etc.?


Eu le même problème. Avez-vous résolu cela dans l'intervalle? À votre santé


J'ai le même problème. Ce serait bien s'il y avait une propriété opentimeout .


4 Réponses :


1
votes

Ajoutez ceci dans votre code: xxx

et je vous suggère de voir Serialport.open Méthode


3 commentaires

Ok, j'espère que cela aidera un autre;)


pourquoi pas Serialport.infiniteTimeTimeout alors


Bonne méthode, mais je pense que les mauvaises constantes - cela attend 1000 secondes. Définir le délai d'attente à 2000 msec ou ainsi.



1
votes

Si je vous ai bien compris, vous souhaitez lire des données du port série, même après que le délai d'attente est survenu.

Si tel est le cas, vous devriez attraper le délai d'attente et continuer votre boucle. par exemple. Code MSDN P>

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


3 commentaires

Vous ne semblez pas comprendre. "Serialport.Open accroche simplement le fil pendant environ 30 secondes". C'est le problème.


Désolé, dois-je supprimer cette réponse alors?


Non, ce sera utile pour quelqu'un d'autre.



5
votes

de MSDN Une seule connexion ouverte peut exister par objet Serialport.

La meilleure pratique pour toute application consiste à attendre une certaine quantité de temps après avoir appelé la méthode de près avant de tenter d'appeler la méthode ouverte, car le port peut ne pas être fermé instantanément.

Lorsque vous appelez Fermer (), ce fil de travail a besoin de temps pour tourner et sortir. Le temps nécessaire n'est pas spécifié et vous ne pouvez pas vérifier que c'était effectué. Tout ce que vous pouvez faire est d'attendre au moins une seconde avant d'appeler ouverte () à nouveau.


1 commentaires

+1 dans la partie de prendre le temps d'ouvrir le Serialport après la fermeture. Cela m'a aidé à améliorer certains code.



4
votes

J'ai rencontré le même problème et j'espère que ma solution peut vous aider.

Vous pouvez détecter les ports série dans un fil séparé, qui sera abandonné dans 500 ms. P>

// 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 !";
        }
      }
   }   
}   


0 commentaires