2010-07-23 100 views
3

我正在尋找一種方法,通過我的c#應用程序中的串行端口獲得儘可能多的控制。問題是我需要與一個沒有文檔的設備進行通信,除了用於控制它的舊C++程序。我嘗試過使用SerialPort類與設備通信,但它的行爲很奇怪(我必須重複一些命令,其他一些命令根本不工作)。 我想複製那個非託管程序的行爲,但是對於serialport類似乎是不可能的,因爲它沒有提供對像DCB這樣的低級函數和結構的訪問。串行端口WIN32的C#/ .NET包裝Comm API

是否有可用於.net的串行通信的低級包裝?也許我可以在運行時使用反射來操縱serialport innacessible成員?

+1

你是否檢查過'SerialPort'類的所有屬性?只有很少的東西沒有被映射。 – 2010-07-23 13:41:03

回答

3

一個串口類是Win32的串口API非常薄的包裝,很難看到其他包裝如何能提高你的生活。從.NET 1.x開始可用的包裝器,它不支持串行端口。這裏是MSDN magazine

但是你可能會有同樣的問題。寫入命令可能會丟失的一種方式是當設備關閉RTS信號時,設備會丟棄接收到的字節(或丟失它們)。您通過將Handshake屬性設置爲RequestToSend來解決此問題。

讀取命令可能出錯的一種方法是讓Read()調用錯誤。它將返回任意數量的字節,數量與接收緩衝區中的一樣多。注意返回值,它會告訴你實際讀取的字節數。唯一的保證是它將至少爲1並且從不超過計數

SysInternals'PortMon utility可以幫助您排除通訊故障,它可以讓您對設備驅動程序看到的內容有一個原始視圖。比較一下,比如說超級終端或另一個已知的好程序。

+0

PortMon的參考是非常有用的,謝謝你 – Kris 2014-08-22 17:59:33

+3

它根本不* thin *。它引入了'SerialStream'層,它又使用了重疊(失效異步)winapi方法。 'SerialPort'有很多麻煩,我現在也在尋找一個真正的* thin * wrapper:'DataReceived'事件是廢話,端口關閉異常,'ObjectDisposedException'(呵呵)usb-to-serial適配器斷開連接等。 – Sinatr 2015-10-19 15:19:01

+0

嗯,如果你不喜歡ODE,那麼當端口打開時不要猛拉連接器。這樣做完全沒有意義。當您使用USB仿真器時,使用「安全移除硬件」托盤圖標是**不可**,串行端口不是即插即用設備。 – 2015-10-19 15:32:06

0

您可以將舊的C++代碼複製到託管的C++類中,然後您可以像使用C#代碼中的任何常規.NET類一樣使用它。這可能是達到目標的最快方式。

5

對於那些建議查看.NET SerialPort類的人;串行相關問題頻繁堆棧溢出的答案提供者,本·福格特,提供了關於爲什麼周圍WinAPI的包裝最終會變成是比使用框架提供的SerialPort一個更好的主意一些優秀的見解:

Ben Voigt on .NET SerialPort

一必讀。

他還提到了他可能會在未來的博客文章中展示的WinAPI包裝器。如果這會發生,它會回答原來的問題。

此外,似乎至少有一個商業解決方案提供所需功能here

另一個編輯:

一些更多的網上搜索,取得了明顯this blog post時起出現在.NET沒有Seri​​alPort類...提供源代碼展示瞭如何包裝的Win32 API爲宗旨。

編輯

一些用戶指出,上述MSDN博客文章的鏈接已經死了。

鏈接的文章的標題是:

Use P/Invoke to Develop a .NET Base Class Library for Serial Device Communications」,從另一個MSDN文章提到它寫由約翰·欣德andpublished 2002年,我可以告訴十月:

enter image description here

不幸的是,微軟似乎只將其雜誌的版本降至2003年:

https://msdn.microsoft.com/en-us/magazine/msdn-magazine-issues.aspx

FWIW,我在其他地方找到half working online version ...

+0

我不介意單數倒票,但請提供反饋意見。 – Kris 2014-08-22 18:00:00

+1

MSDN博客帖子的鏈接已損壞。如果可能的話,也包括文章標題,以防鏈接再次中斷。 – AaA 2017-01-18 02:46:03

+1

我會找的! – Kris 2017-01-18 19:07:41

2

通過PInvoke使用串口工作正常。我們在Silverlight應用程序中這樣做,但它在正常的.NET應用程序中應該是一樣的。 Serial Communication with Silverlight 5 (COM port)的答案提供了一個基本的包裝,可以很容易地適應您的需求。它使用普通的WinAPI方法,因此您可以完全訪問所有串行端口功能,就像在C++應用程序中一樣。

P.S.如果您尚未使用,請使用PortMon來監控線路上正在發生的事情。

+0

感謝ling給其他答案。在那裏發佈的代碼似乎非常有用。在32位Win7上,部分確實是一個很好的工具。我的經驗是它不能在x64上工作(http://stackoverflow.com/questions/1356470/sysinternals-portmon-error-2)。即使以管理員身份運行並設置WinXP SP2/3兼容性也無濟於事。可惜,因爲它是一個很好的工具。 – Kris 2014-08-27 11:13:02

+0

我最終使用了你引用的解決方案,它們很適合我的目的。謝謝。 – Kris 2014-08-29 21:19:18