В C# как я могу слушать COM (последовательный) порт, который уже открыт?
Я использую программу, которая разговаривает с моим портом связи, но я сделал другую программу, которую я хочу "обнюхать" сообщения порта связи и выполнить собственные действия против этих сообщений. Возможно ли это в .NET C#?
4 ответов
есть сторонние библиотеки / инструменты / продукты, которые выставляют трафик, который вас интересует.
вот один, который я использовал для эмуляции последовательного порта, но я думаю, что он предоставляет что - то, что вы можете использовать: http://com0com.sourceforge.net/
можно понюхать трафик от последовательного порта
однако, похоже, нет элемента управления "COMPortSniffer"
представлена допустимая техника, используемая sysinternals здесь
похоже, что он полагается на Программирование Win32, однако я не думаю, что такая вещь возможна непосредственно с C#
Если у вас есть контроль над первой программой, которая разговаривает с вами comm-порт, почему бы не изменить программу для передачи данных, полученных из порта во 2-ю программу вашей через remoting или любой другой тип IPC. Еще лучше, если вы можете написать прокси-программу, подключенную к порту COMM, и 2 другой программы поговорят с этим прокси-сервером, чтобы получить сообщение.
другая идея, если вам нужно нюхать только входящие данные, вы можете получить Y-кабель (splitter) и подключиться к 2 Порт связи, каждая программа подключается к каждому порту связи. Но вы должны убедиться, что 2-Я программа не пытается передавать. В некоторых случаях вам может понадобиться сплиттер, который соединяет только вывод RX для 2-го выхода. Дайте мне знать, если вам понадобится схема.
Если у вас нет 2 COMM, вы можете легко получить USB-последовательный конвертер менее USD10.
проект кода (http://www.codeproject.com/Articles/75770/Basic-serial-port-listening-application), который имеет большой учебник по этому вопросу.
он показывает, как читать данные, поступающие из последовательного порта, и из этого вы должны иметь возможность читать данные.
небольшой фрагмент:
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));
}