В 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));
}