我使用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
任何幫助?
您的_CPU_上有USB連接器嗎? – 2012-07-30 09:56:37
當然,我有一個RS232輸出的硬件,一個RS232轉USB轉換器,和我的CPU上的USB連接器。這樣就可以工作。如果我添加一個「USB網絡服務器」,數據來的方式是RS323-> USB->以太網 - >虛擬化爲USB --->虛擬化爲RS232到COM端口 – 2012-07-30 10:04:35
@羅曼Rdgz:實際上所有你談論的連接連接到[南橋](http://en.wikipedia.org/wiki/Southbridge_(計算)),連接到[北橋](http://en.wikipedia.org/wiki/北橋_(計算))然後到CPU。 USB,RS232和以太網不直接連接到CPU。 – 2012-07-30 10:16:59