我正在尝试设置一个 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 构建模式。
实际上,没有公开“物理” CreateFileAPI,但有两个不同的功能: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 版本。