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

时间:2011-02-05 13:22:47

标签: c# named-pipes virtual-pc

此问题与我的earlier question相关。

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

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

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

当我不使用管道,而是使用文本文件(在Virtual-PC设置中)重定向写入COM-Port的数据时,数据将按预期写入文本文件。因此,在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();

更新

我在guest虚拟机上运行的代码:

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

port.WriteLine("Hallo");

在telewin建议的命令提示符中使用'echo'可以正常工作。 回显和使用上面的代码有什么区别?

1 个答案:

答案 0 :(得分:1)

很抱歉迟到的回复,希望它仍然相关......

在我的测试中,“echo hello> com1”仅在运行程序(启动新的SerialPort)之前工作。运行后,主机程序将不再看到“echo hello> com1”,直到重新启动guest虚拟机。

这表明SerialPort本身的初始化是永久性的。使用Reflector,我们发现SerialPort的ctor没有任何后果,但是它的Open方法调用了SerialStream的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");