【问题标题】:Serial port: read a byte as soon as it arrives串口:一个字节一到就读
【发布时间】:2019-07-24 21:05:45
【问题描述】:

我需要编写一个应用程序,该应用程序可以位于我的电脑上运行的应用程序(第 3 方,无源)和连接到它的串行设备(例如 COM1 上)之间的串行端口通信中间。

一旦您插入电缆,应用程序通常会与设备进行通信。我需要做的是通过在中间“安装”我的应用程序来中断这种通信,这样我就可以控制通过的数据。

我能想到解决这个问题的唯一方法是使用 com0com 创建一对虚拟串行端口 (COM5COM6)。然后我会重定向应用程序以使用 COM5 而不是 COM1(我可以在应用程序选项中设置它),然后编写一个程序,将 COM6 中接收到的每个字节(由应用程序发送)复制到 COM1(发送到设备)和反之亦然。

问题是我需要这样做而不会给通信带来任何延迟,否则应用程序和设备将不同步。

我尝试创建一个 C# 控制台应用程序来执行此操作,但它似乎在引发 datareceived 事件之前等待流中的暂停,从而有效地引入了几毫秒的延迟(速度为 9600)。

我现在想尝试的是重写程序(也许使用 win32 api?),使其在每个 rx 字节到达后立即中继,因此设备不会注意到任何延迟。

我可以使用 win32 执行此操作吗?有没有更简单的解决方案可以推荐?

谢谢

【问题讨论】:

  • 对于 win32 API,您可以使用CreateFile。例如,HANDLE hPort = CreateFile( L"COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
  • 您需要设置COMMTIMEOUTS - 如果应用程序将ReadIntervalTimeoutReadTotalTimeoutMultiplier 设置为MAXDWORD 并将ReadTotalTimeoutConstant 设置为大于零且小于MAXDWORD 的值,则为一调用 ReadFile 函数时会发生以下情况:如果输入缓冲区中有任何字节,ReadFile 会立即返回缓冲区中的字节。

标签: c# windows winapi


【解决方案1】:

对于您的问题,可能没有太多完整的答案,但我认为这可能值得一试。

根据您的需要(您没有解释),您可以尝试将Termite 与 com0com 一起使用。你可以看一个简单的例子here

还有一个开源clone,但我认为您需要的功能(转发)从未实现。

无论如何,Termite 允许编写脚本,因此很有可能能够满足您的需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-29
    • 2011-02-09
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多