代码之家  ›  专栏  ›  技术社区  ›  Phobis

在C中,如何监听已经打开的COM(串行)端口?

  •  9
  • Phobis  · 技术社区  · 17 年前

    我正在使用一个与我的通信端口对话的程序,但是我已经制作了另一个程序,我想“嗅探”通信端口消息并对这些消息执行它自己的操作。这在.NET C中是可能的吗?

    4 回复  |  直到 11 年前
        1
  •  5
  •   Tim    17 年前

    有些第三方库/工具/产品会公开您感兴趣的流量。

    这里有一个我用于串行端口模拟的接口-但我认为它提供了一些您可以使用的功能: http://com0com.sourceforge.net/

        2
  •  2
  •   Eric    17 年前

    可以从串行端口嗅探流量

    然而,似乎没有“行为嗅探器”控制

    提出了一种系统内部构件使用的有效技术。 there

    不过,它似乎依赖于win32编程,我认为用C不能直接实现这一点。#

        3
  •  2
  •   faulty    17 年前

    如果您控制了与您通信的第一个程序,为什么不更改程序,通过远程处理或任何其他类型的IPC将从端口接收的数据传递给您的第二个程序呢?如果您可以编写一个连接到通信端口的代理程序,并让其他程序中的2个与该代理进行对话,以便完成通信,那么更好。

    另一个想法是,如果只需要嗅探输入的数据,就可以得到一条Y形电缆(拆分器)并连接到2个通信端口,每个程序连接到每个通信端口。但是你需要确保第二个程序没有试图传输。在某些情况下,您可能需要一个仅连接第二个输出RX引脚的分路器。如果需要图表,请告诉我。

    如果你没有2个通信,你可以很容易地得到一个低于10美元的USB串行转换器。

        4
  •  0
  •   jbutler483 shennan    11 年前

    代码项目( 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));
    }