我正在尝试设置一个 arduino uno 用于与 Visual Studio 2010 中的 C++ 程序进行串行端口通信。我正在使用此处找到的代码:http: //playground.arduino.cc/Interfacing/CPPWindows
不幸的是,.cpp 文件在第 9 行为变量“portName”提供了以下消息:
错误:“char *”类型的参数与“LPCWSTR”类型的参数不兼容
我不理解此错误消息,并尝试了一些不同的方法来修复它。任何帮助将不胜感激!
我正在尝试设置一个 arduino uno 用于与 Visual Studio 2010 中的 C++ 程序进行串行端口通信。我正在使用此处找到的代码:http: //playground.arduino.cc/Interfacing/CPPWindows
不幸的是,.cpp 文件在第 9 行为变量“portName”提供了以下消息:
错误:“char *”类型的参数与“LPCWSTR”类型的参数不兼容
我不理解此错误消息,并尝试了一些不同的方法来修复它。任何帮助将不胜感激!
鉴于您问题中的代码链接,问题似乎在这里:
Serial::Serial(char *portName) { ... this->hSerial = CreateFile(portName, // <--- ERROR
CreateFile
是一个 Win32 API,它需要一个LPCTSTR
作为第一个字符串参数。
LPCTSTR
是一个 Win32 typedef,它被扩展为:
const char*
在 ANSI/MBCS 版本中const wchar_t*
在 Unicode 版本中(自 VS2005 以来一直是默认设置)由于您使用的是 VS2010,因此您可能处于默认的 Unicode 构建模式。
实际上,没有公开“物理” CreateFile
API,但有两个不同的功能:CreateFileA
和CreateFileW
. 前者采用const char*
输入字符串,后者采用const wchar_t*
.
在 Unicode 版本中,CreateFile
预处理器宏扩展为CreateFileW
; 在 ANSI/MBCS 版本中,CreateFile
扩展为CreateFileA
.
因此,如果您处于 Unicode 构建模式,您的 CreateFile 调用将扩展为CreateFileW(const wchar_t*, ...)
. 由于portName
定义为 a ,因此和char*
之间存在不匹配,并且您会收到编译器错误。wchar_t*
char*
要解决这个问题,您有一些选择。
例如,您可以在代码中明确显示,只需调用CreateFileA()
而不是CreateFile()
. 这样,您将const char*
独立于 Visual Studio 中的实际 ANSI/MBCS/Unicode 设置使用函数的 ANSI/MBCS 版本(即,采用 的函数)。
另一种选择是将您当前的构建设置从默认的 Unicode 模式更改为 ANSI/MBCS。为此,您可以遵循以下路径:
Project Properties | Configuration Properties | General | Character Set
并选择“使用多字节字符集”,如下图所示:
您在 Visual Studio 中的设置可能设置为 Unicode,但您正在编译的代码需要 ASCII。
转到项目属性 -> 配置属性 -> 常规 -> 字符集并选择“使用多字节字符集”。
-苏伦塔尔
您在 Visual Studio 中的设置可能设置为 Unicode,但您正在编译的代码需要 ASCII。
转到项目属性 -> 配置属性 -> 常规 -> 字符集,然后选择“使用多字节字符集”。
您还应该从 C++ -> Preprocessor -> Preprocessor 定义中删除UNICODE
或删除_UNICODE
,如果它们在那里定义的话。
这将使您的代码调用接受char
字符串的 Windows API 函数的 ASCII 版本。