2011-02-05 106 views
1

此問題與我的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

回答

1

很抱歉這麼晚纔回復,希望它仍然相關,...

在我的測試,「回聲你好> 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");