【发布时间】: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- 如果应用程序将ReadIntervalTimeout和ReadTotalTimeoutMultiplier设置为MAXDWORD并将ReadTotalTimeoutConstant设置为大于零且小于MAXDWORD 的值,则为一调用 ReadFile 函数时会发生以下情况:如果输入缓冲区中有任何字节,ReadFile会立即返回缓冲区中的字节。