与虚拟PC的COM端口通信(第2部分)

问题描述:

此问题与我的earlier question有关。与虚拟PC的COM端口通信(第2部分)

连接管道现在已经成功,但我仍然无法从端口读取(或写入)任何数据。

我的第一个猜测是,数据被缓冲。但即使在我写入(在客户端站点上)5000字节(NamedPipeClientStream中的缓冲区大小为512字节)时,我也没有收到任何 数据。

PipeOptions.WriteThrough也没有改变任何东西。

当我不使用管道,而是一个文本文件(在虚拟PC设置中)重定向写入COM端口的数据时,数据按预期写入文本文件。因此,运行在Virtual-PC上的客户端测试程序运行良好。问题可能出现在我的代码中。

var pipe = new NamedPipeClientStream(".", "mypipe", PipeDirection.InOut, PipeOptions.WriteThrough); 

pipe.Connect(); 

// this is blocking 
int i = pipe.ReadByte(); 

var reader = new StreamReader(pipe); 
// this is blocking, too 
var s = reader.ReadLine(); 

更新:

我的来宾操作系统上运行代码:

var port = new SerialPort("COM1"); 
port.Open(); 

port.WriteLine("Hallo"); 

在命令提示符下使用 '回响' 作为telewin建议优秀作品。 回显和使用上述代码有什么区别?

+0

如果您在客户机操作系统上打开命令提示符,公正“回声”的COM端口(即“回声你好> COM1”)?当我尝试这个时,我可以用新的NamedPipeClientStream(“mypipe”)读取数据。 – telewin 2011-02-05 14:56:37

+0

我很困惑。您是否尝试使用命名管道的COM端口? – kenny 2011-02-05 15:06:39

很抱歉这么晚才回复,希望它仍然相关,...

在我的测试,“回声你好> COM1”只能你运行你的内部VPC程序(它启动一个新的SerialPort)之前。在运行它之后,主机程序将不再看到“echo hello> com1”,直到guest虚拟机重新启动。

这表明SerialPort本身的初始化是永久性的。使用Reflector,我们发现SerialPort的ctor没有任何结果,但是它的Open方法调用了Serialtor的ctor。这个ctor会做很多事情:它设置读/写缓冲区,Rts/Dtr和握手模式。经过一些试验后,似乎Rts/Dtr搞砸了“echo hello> com1”。能否请您尝试内VPC这个修改后的代码:

var port = new SerialPort("com1"); 
port.DtrEnable = true; 
port.RtsEnable = true; 
port.Open(); 
port.WriteLine("Hallo");