我正在寫一個SerialPort程序。有時當我想打開SerialPort時,會拋出UnauthorizedAccessException:拒絕訪問COM1。這是因爲另一個程序(由別人編寫而我沒有它的源代碼)正在使用COM1,並且該程序在退出時不關閉COM1。 我想問兩個問題:
如何關閉另一個程序使用的串口
- 如何使用我的代碼,當它被另一個程序使用 (特別是C#代碼)關閉COM1?
- 如果我無法使用C#代碼關閉COM1,如何在Windows操作系統中關閉或釋放COM1?
謝謝。
我正在寫一個SerialPort程序。有時當我想打開SerialPort時,會拋出UnauthorizedAccessException:拒絕訪問COM1。這是因爲另一個程序(由別人編寫而我沒有它的源代碼)正在使用COM1,並且該程序在退出時不關閉COM1。 我想問兩個問題:
如何關閉另一個程序使用的串口
謝謝。
這個堆棧溢出問題的第一步:How do I get the list of open file handles by process in C#?
一旦你有,你可以修改代碼有關閉句柄,或者乾脆殺了具有手柄打開的進程。
然而,這是非常危險的*,容易出現問題,並且需要根據特定部署(x32 vs x64與ARM)以及'COM1'在該特定機器上映射的情況進行重新設計。
On風險:如果串行端口用於例如在手機或類似設備上安裝新固件 - 關閉端口可能會導致設備堵塞。如果端口正用於傳輸數據,則關閉端口可能會導致數據丟失。
祝你好運。但是,如果您銷燬系統或丟失數據,請不要責怪我。
謝謝。我但是我不知道COM1的文件名或文件句柄,你能告訴我這個嗎? – Jerry
它看起來像'\ 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
你可以通過調用
serialPort.Close();
關閉通訊端口在C#中,但除非是你只開你不能關閉COMM端口。
確保在關閉應用程序時關閉通信端口。如果你可以放置代碼,我們可以查看它。
您可能可以使用WMI重新啓動端口。 http://msdn.microsoft.com/en-us/library/windows/desktop/aa393485(v=vs.85).aspx – Kane
我的猜測是,佔用COM端口的程序沒有完全退出,因爲Windows應該恢復Com端口,你有沒有試過看看過程是否仍在運行? –
我也覺得有些程序在使用後並沒有關閉SerialPort。但我不確定哪一個。 – Jerry