2011-03-17 182 views
3

我想使用的Win32 API跟一個COM端口 我發現這個 http://www.robbayer.com/files/serial-win.pdf如何使用Win32 API的交談COM端口(RS232)

hSerial = CreateFile("COM1", 
GENERIC_READ | GENERIC_WRITE, 
0, 
0, 
OPEN_EXISTING, 
FILE_ATTRIBUTE_NORMAL, 
0); 

我使用VS2008和它抱怨 錯誤C2664: 'CreateFileW':不能從轉換參數1 '爲const char [5]' 到 'LPCWSTR'

OK,我猜它不喜歡 「COM1」 是的char *類型,

我嘗試鑄造它LPCWSTR(「COM1」),然後它c ompiles沒有問題。

但是,它會返回「ERROR打開串口-1」,所以它不會成功找到的COM端口。我猜直接投射不是正確的方法?

請告訴我,我應該做的,使這項工作。

在MSDN是不是有幫助 http://msdn.microsoft.com/en-us/library/ms810467.aspx

我不知道什麼是 「gszPort」 意味着

回答

3

嘗試_T("COM1")而不是LPCWSTR("COM1")。它叫做Generic-Text Mapping。我實際上不知道這是否是問題,但使用_T是正確的方法。另外,當Windows API調用返回錯誤條件(如-1)時,您可以使用Last-Error Code (using GetLastError and FormatMessage)來獲取有關該錯誤的更詳細描述。

+0

嗨邁克爾,_T(「COM1」)給出的錯誤標識符找不到,我應該包括一些頭文件? TEXT(「」)適合我 – 2011-03-17 21:10:27

+0

+1 Michael。 阿爾弗雷德,你錯過了那個符號中的下劃線。 _T(「COM1」) 在UNICODE構建下,_T(「」)映射到L「」,這是TEXT(「」)映射到的內容,這就是爲什麼適用於您的原因。並且在MBCS/ANSI構建下,_T(「」)映射到「」,這就是爲什麼你的原始文件不適合你的原因,因爲windows函數被映射到接受Ansi或Unicode字符串的A/W版本,具體取決於構建目標是否是UNICODE。 – meklarian 2011-03-17 21:20:22

+0

嗨邁克爾,我試了_T和__T,沒有運氣,我猜這是unicode問題,以後再試。非常感謝! – 2011-03-17 21:24:16

3

對於Unicode生成CreateFile映射到CreateFileW其預計「寬」的字符串。

CreateFile(L"COM1", ...); 

有人建議明確使用寬版:

CreateFileW(L"COM1", ...); 

或者你可以明確地使用「ANSI」你可以通過在前面你的字符串常量L,這樣的解決眼前的問題版本,即使在Unicode生成:

CreateFileA("COM1", ...); 

如果你希望能夠建立Unicode和ANSI版本,您可以使用宏任選包括將L前綴。有此宏的兩個版本:TEXT(x)_T(x)。如果我沒有記錯,前者通過<tchar.h>來自Windows的API,而後者來自於微軟的執行的C運行時庫。由於這是一個Windows API,我會使用TEXT版本。

CreateFile(TEXT("COM"), ...); 

現在,它可能不值得保持ANSI的向後兼容性。過去十年中發佈的所有Windows版本都在內部使用Unicode,因此如果嘗試使用ANSI版本,則字符串將在運行時擴大。所以,我就不會擔心宏,只是前綴字符串常量與L除非在非常特殊的情況。

+0

非常感謝,很明顯 – 2011-03-23 21:39:34