W SerialPort obiektu .NET jest, czy istnieje sposób, aby ustalić, czy port szeregowy dostaje odłączony lub podłączony.Serial Port Cable Unplugged
Odpowiedz
W przeciwieństwie do USB, port szeregowy nie ma żadnego wbudowanego sposobu wykrywania fizycznej zmiany stanu łącza. Ograniczoną formę sygnalizacji "urządzenie gotowe/niegotowe" można wykonać za pomocą niektórych pinezek (mianowicie DTR, DSR, a czasem DCD), ale nie wydaje się to dokładnie to, czego szukasz (nie jest wbudowane na RS232 - urządzenie musi go obsługiwać, głównie używasz go do komunikowania się z modemami.)
Krótko mówiąc: nie, w ogólnym przypadku. Jeśli znasz/możesz zaprogramować urządzenie, z którym próbujesz się komunikować, i wiesz, że będzie ono utrzymywać określoną linię na wysokim poziomie (na przykład), możesz sondować, szukając linii, która będzie wysoka. Ale jeśli podłączysz urządzenie, które nie jest zaprogramowane na zrobienie czegoś tak przewidywalnego, to naprawdę nie da się tego powiedzieć. (Niektóre urządzenia mogą domyślnie trzymać DSR, ale w żaden sposób nie jest to pewny zakład.)
można wykryć dostepne porty seryjny, można spróbować porozumieć się z nimi w środku spróbuj ... catch catch.
To jest przykład wykrywania portów w C#
using System;
using System.Collections.Generic;
using System.IO.Ports;
public class MyClass
{
public static void Main()
{
string[] sPorts = SerialPort.GetPortNames();
foreach(string port in sPorts)
WL(port);
RL();
}
#region Helper methods
private static void WL(object text, params object[] args)
{
Console.WriteLine(text.ToString(), args);
}
private static void RL()
{
Console.ReadLine();
}
private static void Break()
{
System.Diagnostics.Debugger.Break();
}
#endregion
}
nie próbowałem, ale spojrzeć na wydarzenia SerialPort.PinChanged i DsrChanged.
Ilekroć jakieś normalne urządzenie jest podłączone do portu szeregowego i włączone, wtedy oczekiwałbym, że pin DSR portu zostanie zapewniony; i odwrotnie, jeśli to urządzenie jest odłączone, lub gdy jest wyłączone, to oczekiwałbym, że stan pinowy DSR zmieni się/spadnie.
zwykłe znaczenie poszczególnych szpilek jest:
- DSR: urządzenie jest podłączone do zasilania i włączony
- CTS: urządzenie jest gotowe do odbioru danych (może to być spowodowane nawet po urządzenie jest podłączone, np. gdy urządzenie ma ograniczony wewnętrzny bufor i wykorzystuje ten pin do sterowania przepływem danych z komputera)
- DCD: urządzenie (modem) nawiązało połączenie przez linię telefoniczną z innym modemem (więc wszystko, co wysyłasz, traktowane jest jako dane do przesłania o zdalny modem)
Spośród tych osób, który odpowiada za OP, jest DSR.
Prawda, jeśli urządzenie używa uzgadniania sprzętowego. Wiele urządzeń tego nie robi. W rzeczywistości niektóre porty szeregowe nie mają nawet tych pinów połączonych. –
To będzie zależeć od rodzaju urządzenia, które łączysz z jakim rodzajem kabla.
Najlepiej jest spróbować obsługi obsługi zdarzeń PinChanged.
Niektóre urządzenia będą podnosić DSR po podłączeniu i włączeniu, inne CTS, inne będą używać ich do uzgadniania.
Większość urządzeń szeregowych ma pewien rodzaj potwierdzenia odpowiedzi na zapytanie. po prostu wyślij proste zapytanie i czekaj na odpowiedź. Jeśli go nie dostaniesz, urządzenie nie istnieje lub przynajmniej nie odpowiada.
Istnieje jest sposobem na wykrycie usunięcia/włożenia portu szeregowego.NET - zobacz moją odpowiedź na Detect serial port insertion/removal
Plakat prawdopodobnie chciał wykryć, czy * urządzenie * jest podłączone do portu szeregowego, a nie, jeśli port szeregowy jest zainstalowany w systemie. – Zmaster
@Zmaster - masz rację! Chyba nie myślałem w ten sposób. Usunąłem swój komentarz, ale zostawię odpowiedź tutaj, na wypadek, gdyby ktoś szukał sytuacji, której dotyczy moja odpowiedź. – Pat
Public Class SerialPort
Inherits IO.Ports.SerialPort
Event Disconnected()
Public Sub OpenWithDisconnectionevent()
Me.Open()
Dim t As New Threading.Thread(AddressOf ConnectivityChecker)
t.Start()
End Sub
Sub ConnectivityChecker()
Do
If Me.IsOpen = False Then
RaiseEvent Disconnected()
GoTo ThreadExit
End If
Loop
ThreadExit:
End Sub
End Class
- 1. Linux Serial Port: Blocking Read with Timeout
- 2. Rails Devise Action Cable
- 3. Arduino: użycie Serial i Software Serial z modułem Bluetooth
- 4. Serial: write() throttling?
- 5. Sekwencja PostgreSQL po Serial
- 6. Arduino odczytać ciąg z Serial
- 7. Port USB na port szeregowy
- 8. Metoda sniff komunikacji usb-serial na osx
- 9. Virtual Serial Device w języku Python?
- 10. Wpisz "DispatchQueue.Attributes" nie ma członka "serial"
- 11. Czy urządzenie Postgresql SERIAL działa inaczej?
- 12. Action Cable nie działa po wiązaniu z ip
- 13. Określić, czy port szeregowy jest normalny COM lub SPP
- 14. Port szeregowy lub port USB za pomocą D?
- 15. Port C++ AtomicLong.lazySet
- 16. Port LWJGL do Androida
- 17. Mochiweb Port 80
- 18. HttpWebRequest Port Wyczerpanie
- 19. python ftplib podać port
- 20. Nowy dostępny port COM
- 21. Port dos2unix do brainfuck
- 22. CKAN port/Vagrant spedycja
- 23. Port Apache do przodu
- 24. Otwarty port w Ubuntu
- 25. Domyślny port Tensorflow Tensorboard
- 26. Serial I/O Overlapped/Non-Overlapped z Windows/Windows CE
- 27. Kolumna "django_migrations.id" ma nieobsługiwany typ "serial" [z Amazon Redshift]
- 28. SMBIOS - Uzyskaj informacje o modułach SPD (Serial Presence Detect) C#
- 29. Jak używać protokołu Google protobuf do komunikacji przez port szeregowy?
- 30. Czym dokładnie jest Port Listening
wierzę, że ta forma .Podłączyć() w pętli wiążącej do portu dla każdego połączenia jest niezgrabne, zwłaszcza jeśli chcę piękny zdarzeniami SerialPortDisconnected zdarzeń. – maxfridbe
'string [] sPorts = SerialPort.GetPortNames();' nie działa, ponieważ gdy port jest podłączony ex: 'COM1', a następnie jest odłączony' GetPortNames' nadal zgłasza "COM1" istnieje ... Właśnie to przetestowałem. – MrHIDEn