Używam programu, który komunikuje się z moim portem COMM, ale zrobiłem inny program, który chcę "powąchać" komunikaty portu komunikacyjnego i wykonać własne działania przeciwko tym wiadomościom dodatkowo. Czy jest to możliwe w .NET C#?W języku C# jak mogę odsłuchiwać port COM (seryjny), który jest już otwarty?
Odpowiedz
Istnieją biblioteki/narzędzia/produkty stron trzecich, które eksponują ruch z twojego zainteresowania.
Oto jeden użyłem do emulacji portu szeregowego - ale myślę, że zapewnia coś można użyć: http://com0com.sourceforge.net/
Jest to możliwe do wykrycia ruchu z portu szeregowego
Jednak nie robi wydaje się być „COMPortSniffer” Control
Poprawna technika używana przez sysinternals prezentowana jest there
Wydaje polegać na programowaniu Win32 jednak nie sądzę, że coś takiego jest możliwe bezpośrednio z C#
Jeśli masz kontrolę nad pierwszym programem, który mówi do ciebie Comm portu, dlaczego nie zmienić program przekazywać dane otrzymane z portu do drugiego programu użytkownika za pośrednictwem zdalnego sterowania lub dowolnego innego typu IPC. Jeszcze lepiej, jeśli możesz napisać program proxy, który łączył się z portem COMM, i mieć 2 z innych programów rozmawiać z tym proxy, aby uzyskać komunikację.
Innym pomysłem jest, jeśli chcesz sniffować tylko przychodzące dane, możesz uzyskać kabel Y (splitter) i połączyć się z 2 portem COMM, każdy program łączy się z każdym portem COMM. Ale musisz się upewnić, że drugi program nie próbuje transmitować. W niektórych przypadkach może być potrzebny rozdzielacz, który łączy tylko pin RX dla drugiego wyjścia. Daj mi znać, jeśli potrzebujesz diagramu.
Jeśli nie masz 2 COMM, możesz łatwo uzyskać konwerter USB-Serial za mniej niż 10 USD.
projekt kodu (http://www.codeproject.com/Articles/75770/Basic-serial-port-listening-application), który ma świetny samouczek na ten temat.
Pokazuje, jak odczytywać dane przychodzące z portu szeregowego iz tego powodu powinien być możliwy odczyt danych.
krótki fragment:
void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int dataLength = _serialPort.BytesToRead;
byte[] data = new byte[dataLength];
int nbrDataRead = _serialPort.Read(data, 0, dataLength);
if (nbrDataRead == 0)
return;
// Send data to whom ever interested
if (NewSerialDataRecieved != null)
NewSerialDataRecieved(this, new SerialDataEventArgs(data));
}
W tym przypadku trzeba mieć kontrolę na temat pierwotnego kodu źródłowego konsumentów do publikowania danych odczytu. Nie wącha ustalonej komunikacji szeregowej. – sahl04