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? P>
4 Réponses :
Ajoutez ceci dans votre code: et je vous suggère de voir Serialport.open Méthode P> P>
Ok, j'espère que cela aidera un autre;)
pourquoi pas Serialport.infiniteTimeTimeout code> 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.
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) { } } }
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.
de MSDN 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. P>
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. P>
+1 dans la partie de prendre le temps d'ouvrir le Serialport après la fermeture. Cela m'a aidé à améliorer certains code.
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 !"; } } } }
Ê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 code>.