2012-06-25 35 views
3

我正在寫一個SerialPort程序。有時當我想打開SerialPort時,會拋出UnauthorizedAccessException:拒絕訪問COM1。這是因爲另一個程序(由別人編寫而我沒有它的源代碼)正在使用COM1,並且該程序在退出時不關閉COM1。 我想問兩個問題:
如何關閉另一個程序使用的串口

  1. 如何使用我的代碼,當它被另一個程序使用 (特別是C#代碼)關閉COM1?
  2. 如果我無法使用C#代碼關閉COM1,如何在Windows操作系統中關閉或釋放COM1?

謝謝。

+0

您可能可以使用WMI重新啓動端口。 http://msdn.microsoft.com/en-us/library/windows/desktop/aa393485(v=vs.85).aspx – Kane

+0

我的猜測是,佔用COM端口的程序沒有完全退出,因爲Windows應該恢復Com端口,你有沒有試過看看過程是否仍在運行? –

+0

我也覺得有些程序在使用後並沒有關閉SerialPort。但我不確定哪一個。 – Jerry

回答

6

這個堆棧溢出問題的第一步:How do I get the list of open file handles by process in C#?

一旦你有,你可以修改代碼有關閉句柄,或者乾脆殺了具有手柄打開的進程。

然而,這是非常危險的*,容易出現問題,並且需要根據特定部署(x32 vs x64與ARM)以及'COM1'在該特定機器上映射的情況進行重新設計。

On風險:如果串行端口用於例如在手機或類似設備上安裝新固件 - 關閉端口可能會導致設備堵塞。如果端口正用於傳輸數據,則關閉端口可能會導致數據丟失。

祝你好運。但是,如果您銷燬系統或丟失數據,請不要責怪我。

+0

謝謝。我但是我不知道COM1的文件名或文件句柄,你能告訴我這個嗎? – Jerry

+1

它看起來像'\ Device \ Com0'或'\ Device \ Serial0' - 請參閱[Win32文件命名](http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v = vs.85).aspx#win32_device_namespaces) - 並使用[SysInternals WinObj](http://technet.microsoft.com/en-us/sysinternals/bb896657.aspx)瀏覽您的機器設備。 – 2012-06-25 04:33:58

-2

你可以通過調用

serialPort.Close(); 

關閉通訊端口在C#中,但除非是你只開你不能關閉COMM端口。

確保在關閉應用程序時關閉通信端口。如果你可以放置代碼,我們可以查看它。

+2

你沒有回答我的問題。我知道serialPort.close()可以關閉我打開的SerialPort。我想關閉另一個由別人編寫的程序打開的COM1。 – Jerry

+0

那就是我所說的,你不能關閉其他應用程序訪問的COMMP端口。只有您可以做的方式是確定哪個應用程序正在訪問並終止該進程。 –

+0

我不這麼認爲。我使用電腦,我可以編寫任何運行的代碼,我完全可以控制它。必須有辦法關閉另一個程序使用的COM1。例如,查找並殺死使用COM1的線程。我想找一個簡單的方法。 – Jerry

相關問題