2010-07-06 14 views
9

我與SerialPort.Open();SerialPort port.open「端口'COM2'不存在。」

大問題我正在與USB虛擬COM端口(cdc)通信,它被列爲COM2。

它在TeraTerm/hyperTerminal ect中正常工作。但是當我嘗試在C#中打開端口時,它會給我例外The port 'COM2' does not exist

我使用SerialPort.GetPortNames()函數獲取端口名稱,在調試時它看起來很好。

我試圖設置名稱硬編碼,但沒有運氣。

現在真是奇怪的事情,它在一些PC上運行正常,並在其他PC上失敗。在某些電腦上,它一直在失敗,而在其他電腦上,失敗的時間只有10%。

更奇怪的是它取決於使用的USB端口,一些端口工作正常,其他端口失效(在同一臺PC上!)。

有人可以幫我嗎?

+0

司機麻煩,他們往往是可怕的。查找製造商的更新,如果無法修復,請將設備垃圾。 – 2010-07-06 13:34:48

+0

我找到了解決方案。不是一個漂亮的,但在一些PC上的USB驅動程序只是不太好。 那麼我最後只是嘗試打開端口十次,每次嘗試之間有500毫秒的延遲。我認爲漏洞問題是getPortNames()函數之間的延遲監聽端口可用,直到實際上可以打開端口。 – JakobJ 2010-07-08 09:33:21

+0

男人,這是可惡的。我知道你的痛苦。我的家用電腦使用依賴USB連接的顯示器設置。任何時候系統失去電力,我必須花費10分鐘在我的膝蓋上反覆重新插入USB連接直到需要並且我可以有視頻。 USB需要工作。 – 2010-07-08 17:43:17

回答

6

我以前使用過虛擬串行端口。對於某些Windows API調用,它們通常不能作爲「COMX:」訪問,您必須完全指定它們。這可能就是這種情況。嘗試使用串口設備的Windows設備命名空間路徑。例如:「\\。\ COM2」

我發現對調試有用的另一件事是在給定的串口上打開Hyperterm。

最後一件事:爲了在沒有所有硬件的系統上調試你的邏輯,我發現了這個很棒的程序com0com。這是一個GPL Sourceforge項目,可在您的系統上創建並列的虛擬COM端口對。無論寫給誰都可以從另一個讀取,反之亦然。你可以寫一個模擬器並給它一個端口,或者打開Hyperterm。然後把另一個給你的程序。不需要電纜或其他硬件進行測試。

+1

com0com還有適當的文檔和用法示例! 出色的發現和值得的時間來檢查,如果你做任何類型的系列測試工作! – omglolbah 2015-03-05 14:08:42

+0

我正嘗試從RDP會話(Server 2008 R2上)連接到本地COM4。您的建議幫助我發現端口實際上是\\ tsclient \\ COM4。我仍然不得不欺騙.NET讓我使用這個名字,但最終我得到了它。 – tgolisch 2015-06-19 20:53:33

3

如果驅動程序爲「COM2」返回意外的「文件類型」,則可能導致此錯誤。

嘗試使用p/Invoking GetFileType,我相信您會看到該模式。它必須是FILE_TYPE_CHARFILE_TYPE_UNKNOWN否則SerialPort將拋出該異常。

class Program 
{ 
    static void Main(string[] args) 
    { 
    string portName = @"COM2"; 
    IntPtr handle = CreateFile(portName, 0, 0, IntPtr.Zero, 3, 0x80, IntPtr.Zero); 
    if (handle == (IntPtr)(-1)) 
    { 
     Console.WriteLine("Could not open " + portName + ": " + new Win32Exception().Message); 
     Console.ReadKey(); 
     return; 
    } 

    FileType type = GetFileType(handle); 
    Console.WriteLine("File " + portName + " reports its type as: " + type); 

    Console.ReadKey(); 
    } 

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)] 
    public static extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr SecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile); 

    [DllImport("kernel32.dll")] 
    static extern FileType GetFileType(IntPtr hFile); 

    enum FileType : uint 
    { 
    UNKNOWN = 0x0000, 
    DISK = 0x0001, 
    CHAR = 0x0002, 
    PIPE = 0x0003, 
    REMOTE = 0x8000, 
    } 
} 

另請參閱MSDN論壇上的this thread

+0

謝謝!我試過你的代碼,但似乎沒有文件類型和公開問題之間的模式。 – JakobJ 2010-07-08 09:28:48