Mam automatycznie wykrywany wątek, który próbuje otworzyć porty w kolejności i dopasować odebrane dane, tym samym wykrywając port, w którym odpowiednie urządzenie wysyła dane. Teraz istnieje kilka portów, w których SerialPort.Open po prostu zawiesza wątek na ~ 30 sekund. Jak ustawić limit czasu dla funkcji SerialPort.Open?C#: Limit czasu na SerialPort.Open?
Odpowiedz
Dodaj to w kodzie:
commPort = new SerialPort();
commPort.ReadTimeout = 1000000;
commPort.WriteTimeout = 1000000;
A ja proponuję, aby zobaczyć SerialPort.Open Method
już zrobione ... – gdario
OK, mam nadzieję, że to pomoże jeszcze jeden;) –
dlaczego nie 'SerialPort.InfiniteTimeout' następnie –
Jeśli ja zrozumiałem, chcesz odczytać dane z portu szeregowego, nawet po wystąpieniu limitu czasu.
Jeśli tak, to powinieneś złapać wyjątek TimeoutException i kontynuować tworzenie pętli. na przykład MSDN CODE
public static void Read()
{
while (_continue)
{
try
{
string message = _serialPort.ReadLine();
Console.WriteLine(message);
}
catch (TimeoutException) { }
}
}
Od MSDN
Tylko jedno otwarte połączenie może istnieć za obiekt SerialPort.
Najlepszą praktyką dla każdej aplikacji jest oczekiwanie na pewien czas po wywołaniu metody Close przed próbą wywołania metody Open, ponieważ port może nie zostać natychmiast zamknięty.
Po wywołaniu Close() ten wątek roboczy potrzebuje czasu na obrót i wyjście. Wymagany czas nie jest określony i nie można zweryfikować, czy zostało ono wykonane. Wszystko, co możesz zrobić, to odczekać przynajmniej sekundę, zanim ponownie zadzwonisz do Open().
+1 do części dotyczącej czasu na otwarcie SerialPort po jej zamknięciu. Pomogło mi to poprawić kod. – Yetti
Wystąpił ten sam problem i mam nadzieję, że moje rozwiązanie może ci pomóc.
Możesz wykryć porty szeregowe w osobnym wątku, który zostanie przerwany w ciągu 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 !";
}
}
}
}
Możliwe rozwiązania mogą zostać dodane do rozwiązania. Możesz użyć wielu wątków, aby przyspieszyć proces i użyć ProgressBar
, aby wyraźnie wyświetlić postępy.
- 1. C# limit czasu zadania fabrycznego
- 2. Limit czasu oczekiwania na MongoConnection
- 3. Limit czasu NSURLSessionUploadTask na zewnątrz
- 4. C: limit czasu połączenia z gniazdem
- 5. Limit czasu oczekiwania WaitForSingleObject
- 6. limit czasu sesji wiosennej
- 7. Limit czasu wdrożenia Capistrano
- 8. Limit czasu Linq-SQL:
- 9. Limit czasu QNetworkAccessManager
- 10. Zmodyfikuj limit czasu connect()
- 11. java.net.SocketTimeoutException: upłynął limit czasu
- 12. Limit czasu sesji IIS vs Limit czasu sesji ASP.NET
- 13. Semafor Przekroczono limit czasu
- 14. Limit czasu GetBufferLock przekroczył
- 15. Limit czasu pracy jednorożców
- 16. Limit czasu w DefaultHttpClient
- 17. FtpWebResponse, limit czasu operacji
- 18. Ustaw limit czasu jednorożca
- 19. Przekroczono limit czasu oczekiwania
- 20. Przekroczono limit czasu na żądanie sieci Web
- 21. GoogleAppEngine limit czasu oczekiwania na wyjątek
- 22. Ustaw limit czasu na pliku simplexml_load_file
- 23. przekroczony limit czasu oczekiwania na hibernację blokady;
- 24. PHP: Jak uchwycić limit czasu na dio_read()?
- 25. JUnit test na spodziewany limit czasu
- 26. Ustaw limit czasu na URL.openStream() Android
- 27. Anuluj limit czasu AngularJS $ na routingu Zmień
- 28. Jaki jest limit czasu na połączeniu URLLoader.load?
- 29. Limit czasu oczekiwania na webtyty Jetty
- 30. Limit czasu w async/poczekaj na
Czy przeglądasz porty szeregowe z GetPortNames (http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.getportnames.aspx) lub czy próbujesz otworzyć COM1, COM2 itp.? – SwDevMan81
Mam ten sam problem. Rozwiązałeś to w międzyczasie? Pozdrawiam – tamberg
Mam ten sam problem. Byłoby miło, gdyby istniała własność 'OpenTimeout'. –