1

这个问题与我之前的问题有关

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

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

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

当我不使用管道而是使用文本文件(在 Virtual-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 的建议,在命令提示符下使用“echo”可以正常工作。回显和使用上述代码有什么区别?

4

1 回答 1

1

抱歉回复晚了,希望它仍然相关......

在我的测试中,“echo hello > com1”仅您在 VPC 中运行程序(启动新的 SerialPort)之前有效。运行后,主机程序将不再看到“echo hello > com1”,直到客户机重新启动。

这表明 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");
于 2011-02-12T20:32:06.220 回答