此问题与我的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'可以正常工作。 回显和使用上面的代码有什么区别?
答案 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");