2015-06-12 42 views
4

我正嘗試在visual studio 2010中爲C++程序設置串口通信的arduino uno。 「M從代碼工作在這裏找到:http://playground.arduino.cc/Interfacing/CPPWindowsVisual Studio 2010 Arduino cpp錯誤:類型「char *」的參數與類型爲「LPCWSTR」的參數不兼容

不幸的是,.cpp文件給我的變線9以下消息‘端口名’:

錯誤:類型‘的char *’的說法是不兼容參數類型爲「LPCWSTR」

我不明白這個錯誤信息,並嘗試了幾個不同的thi恩格斯解決它。任何幫助將不勝感激!

+0

的可能重複[什麼是LPCWSTR代表以及應如何與如何處理?(http://stackoverflow.com/questions/2230758/what-does-lpcwstr-stand-for-以及如何處理 - 與) –

回答

1

您在Visual Studio中的設置可能設置爲Unicode,但您正在編譯的代碼需要ASCII。

轉到項目屬性 - >配置屬性 - >常規 - >字符集,然後選擇「使用多字節字符集」。

您還應該從C++→預處理器→預處理器定義中刪除UNICODE_UNICODE(如果它們在那裏定義的話)。

這將使您的代碼調用Windows API函數的ASCII版本,該函數接受char字符串。

+0

AND常數。 LPCWSTR的意思是「指向恆定寬字符串的長指針」。一個'wchar_t const *'。 –

+0

該字符串被標記爲'const',因爲'CreateFile'不會改變它,但你仍然可以傳遞一個非const指針。 – Alex

9

鑑於你的問題的代碼鏈接,看來問題就在這裏:

Serial::Serial(char *portName) 
{ 
    ... 

    this->hSerial = CreateFile(portName, // <--- ERROR 

CreateFile is a Win32 API that expects an LPCTSTR as first string parameter

LPCTSTR是Win32的typedef,它擴展爲:

  • 在ANSI/MBCS const char*構建
  • 以Unicode
  • const wchar_t*構建(其已自VS2005默認值)

由於您正在使用VS2010,可能您處於默認的Unicode構建模式。

實際上,沒有「物理」CreateFile API暴露,但有兩個截然不同的函數:CreateFileACreateFileW。前者採用const char*輸入字符串,後者採用const wchar_t*

在Unicode構建中,CreateFile是一個預處理宏,擴展爲CreateFileW;在ANSI/MBCS版本中,CreateFile擴展爲CreateFileA

因此,如果您處於Unicode構建模式,則您的CreateFile調用將擴展爲CreateFileW(const wchar_t*, ...)。由於portName定義爲char*,因此wchar_t*char*之間存在不匹配,並且您收到編譯器錯誤。

要解決這個問題,你有一些選擇。

例如,你可以明確在你的代碼,而只是調用CreateFileA(),而不是CreateFile()。這樣,您將使用該函數的ANSI/MBCS版本(即採用const char*的版本),與Visual Studio中的實際ANSI/MBCS/Unicode設置無關。


另一種選擇是將當前的編譯設置從默認的Unicode模式更改爲ANSI/MBCS。要做到這一點,你可以按照以下路徑:

Project Properties | Configuration Properties | General | Character Set 

,並選擇「使用多字節字符集」,作爲顯示在下面的截圖:

Setting Multi-Byte Character Set in VS2010 IDE

+0

您的回答對於初學者來說肯定比我更有用,+1 :) – Alex

+0

@Alex:謝謝:) –

+0

感謝您提及CreateFileA和CreateFileW。我甚至不知道他們。 – James

2

你在視覺設置Studio可能設置爲Unicode,但您正在編譯的代碼需要ASCII。

轉到項目屬性 - >配置屬性 - >常規 - >字符集,然後選擇「使用多字節字符集」。

-Surenthar

相關問題