2012-07-30 51 views
2

我使用Ramon de Klein's CSerial library虛擬COM端口,以便從我的C++代碼打開和管理串行端口。打開與的CSerial(C++)

我的硬件實現與FTDI芯片串行TU USB轉換器,所以我能串行端口連接到USB插頭我的CPU英寸一旦安裝了FTDI驅動程序,虛擬COM端口將顯示在'設備管理器'(Windows)上。

如果我試圖打開它,它的工作原理。

但現在我已經安裝了USB像this one以太網服務器。所以我安裝了它的驅動程序和軟件,並且在連接了一些USB設備之後,它被檢測到,並且作爲虛擬串行端口添加到「設備管理器」窗口。

但是,當我嘗試打開端口,它不起作用。 如果我用類似超級終端的應用程序打開端口,它就可以工作,就好像它是一個普通的串行端口,但不在我的代碼中。

的CSerial庫的工作方式,就好像它正在創建一個新的文件,並給予LastErrorCode爲2:「找不到文件」。這是從的CSerial庫Open方法:

LONG CSerial::Open (LPCTSTR lpszDevice, DWORD dwInQueue, DWORD dwOutQueue, bool fOverlapped) 
{ 
    // Reset error state 
    m_lLastError = ERROR_SUCCESS; 

    // Check if the port isn't already opened 
    if (m_hFile) 
    { 
     m_lLastError = ERROR_ALREADY_INITIALIZED; 
     _RPTF0(_CRT_WARN,"CSerial::Open - Port already opened\n"); 
     return m_lLastError; 
    } 

    // Open the device 
    m_hFile = ::CreateFile(lpszDevice, 
          GENERIC_READ|GENERIC_WRITE, 
          0, 
          0, 
          OPEN_EXISTING, 
          fOverlapped?FILE_FLAG_OVERLAPPED:0, 
          0); 
    if (m_hFile == INVALID_HANDLE_VALUE) 
    { 
     // Reset file handle 
     m_hFile = 0; 

     // Display error 
     m_lLastError = ::GetLastError(); 
     _RPTF0(_CRT_WARN, "CSerial::Open - Unable to open port\n"); 
     return m_lLastError; 
    } 

#ifndef SERIAL_NO_OVERLAPPED 
    // We cannot have an event handle yet 
    _ASSERTE(m_hevtOverlapped == 0); 

    // Create the event handle for internal overlapped operations (manual reset) 
    if (fOverlapped) 
    { 
     m_hevtOverlapped = ::CreateEvent(0,true,false,0); 
     if (m_hevtOverlapped == 0) 
     { 
      // Obtain the error information 
      m_lLastError = ::GetLastError(); 
      _RPTF0(_CRT_WARN,"CSerial::Open - Unable to create event\n"); 

      // Close the port 
      ::CloseHandle(m_hFile); 
      m_hFile = 0; 

      // Return the error 
      return m_lLastError; 
     } 
    } 
#else 

    // Overlapped flag shouldn't be specified 
    _ASSERTE(!fOverlapped); 

#endif 

    // Setup the COM-port 
    if (dwInQueue || dwOutQueue) 
    { 
     // Make sure the queue-sizes are reasonable sized. Win9X systems crash 
     // if the input queue-size is zero. Both queues need to be at least 
     // 16 bytes large. 
     _ASSERTE(dwInQueue >= 16); 
     _ASSERTE(dwOutQueue >= 16); 

     if (!::SetupComm(m_hFile,dwInQueue,dwOutQueue)) 
     { 
      // Display a warning 
      long lLastError = ::GetLastError(); 
      _RPTF0(_CRT_WARN,"CSerial::Open - Unable to setup the COM-port\n"); 

      // Close the port 
      Close(); 

      // Save last error from SetupComm 
      m_lLastError = lLastError; 
      return m_lLastError;  
     } 
    } 

    // Setup the default communication mask 
    SetMask(); 

    // Non-blocking reads is default 
    SetupReadTimeouts(EReadTimeoutNonblocking); 

    // Setup the device for default settings 
    COMMCONFIG commConfig = {0}; 
    DWORD dwSize = sizeof(commConfig); 
    commConfig.dwSize = dwSize; 
    if (::GetDefaultCommConfig(lpszDevice,&commConfig,&dwSize)) 
    { 
     // Set the default communication configuration 
     if (!::SetCommConfig(m_hFile,&commConfig,dwSize)) 
     { 
      // Display a warning 
      _RPTF0(_CRT_WARN,"CSerial::Open - Unable to set default communication configuration.\n"); 
     } 
    } 
    else 
    { 
     // Display a warning 
     _RPTF0(_CRT_WARN,"CSerial::Open - Unable to obtain default communication configuration.\n"); 
    } 

    // Return successful 
    return m_lLastError; 
} 

我不明白爲什麼它不會以同樣的方式直接將USB到電腦前工作的:我一直認爲它應該工作,如果COM在「設備管理器」中列出,與它真正連接的地方無關。

在平衡時,數據的方式是從正在添加是:

RS232 --->轉換爲USB ---> USB連接器CPU --->虛擬化爲RS232中的COM端口

現在是:

RS232 --->轉換成USB --->通過「netUSB服務器」--->以太網/ WiFi在CPU上轉換爲以太網--->虛擬化爲USB設備--->在COM端口虛擬化爲RS232

任何幫助?

+0

您的_CPU_上有USB連接器嗎? – 2012-07-30 09:56:37

+0

當然,我有一個RS232輸出的硬件,一個RS232轉USB轉換器,和我的CPU上的USB連接器。這樣就可以工作。如果我添加一個「USB網絡服務器」,數據來的方式是RS323-> USB->以太網 - >虛擬化爲USB --->虛擬化爲RS232到COM端口 – 2012-07-30 10:04:35

+0

@羅曼Rdgz:實際上所有你談論的連接連接到[南橋](http://en.wikipedia.org/wiki/Southbridge_(計算)),連接到[北橋](http://en.wikipedia.org/wiki/北橋_(計算))然後到CPU。 USB,RS232和以太網不直接連接到CPU。 – 2012-07-30 10:16:59

回答

1

問題出現的原因不在於硬件元素,而是因爲分配給COM端口的號碼。

當COM端口是超過9,CreateFile函數無法打開該設備,並返回一個INVALID_HANDLE_VALUE。

的Bug報告和解決方案的報道here