我们正在尝试通过串行端口连接两个Hyper-V VM。 Hyper-V将串行端口公开为主机系统的命名管道,并实现命名管道的服务器端。因此,为了连接它们,我们需要编写一个连接到两个VM的命名管道客户端,并来回复制数据。
We have written such an application。不幸的是,此应用程序丢失了数据。
如果我们连接两个超文本并让它们交换数据,则传输有时会成功,但在许多情况下,接收端报告错误,或者传输只是死锁。同样,如果我们使用链接来运行内核调试器,它似乎也经常挂起。
数据丢失的原因是什么?以这种方式连接命名管道时必须采取哪些预防措施?
修改:我们使用kdsrv.exe解决了这个问题。调试对象的COM端口继续通过命名管道公开,但是,调试器端通过TCP与kdserv进行通信。
答案 0 :(得分:1)
数据丢失不是由于命名管道造成的。实际上,COM端口(仿真和物理)可能会丢失数据,因为它们在UART中使用小缓冲区运行。
命名管道接收写入COM端口的所有数据。您的程序从命名管道读取数据并将其写入另一个命名管道。如果写入速度太慢,接收COM端口的UART可能会溢出导致数据丢失,那么这就是数据丢失的原因。
您可能需要添加一些延迟以避免超出接收方预期的波特率。
此外,您的计划中缺少ResetEvent()
次来电。
对于您的KD问题,您可能需要将resets=0
添加到连接字符串。
答案 1 :(得分:0)
我没有尝试通过串口连接VM但我通过USB连接VM和主机(通过网络) 它的工作原理。 如果您的软件需要建立串行连接,请尝试通过串口仿真器通过tcp \ ip进行测试。
答案 2 :(得分:0)
我认为John的建议是正确的 - 如果你使用慢速CPU来模拟两个VM,那么客户操作系统的串口驱动程序就会远离高速版本。所以John的建议是将串行链路的输入/输出端设置为最慢的速度。即,您不能使用高波特率进行VM间串行通信。相反,您必须使用最慢的速度,以便VM来宾驱动程序将采用该提示并使用较慢版本的驱动程序。但是你的物理机必须有足够的CPU速度来同时运行两个VM,以避免串行驱动程序的“仿真漂移”。
嗯,只是我的猜测,但是你的问题有一个VirtualBox版本,似乎没有运行它的问题:
但VirtualBox的以下错误提示确实描述了与您的问题有很多相似之处:
https://www.virtualbox.org/ticket/1548
阅读结尾似乎表明该解决方案与VirtualBox的内部源代码有关。也许这是Hyper-V的问题?