4

我正在尝试设置一个 arduino uno 用于与 Visual Studio 2010 中的 C++ 程序进行串行端口通信。我正在使用此处找到的代码:http: //playground.arduino.cc/Interfacing/CPPWindows

不幸的是,.cpp 文件在第 9 行为变量“portName”提供了以下消息:

错误:“char *”类型的参数与“LPCWSTR”类型的参数不兼容

我不理解此错误消息,并尝试了一些不同的方法来修复它。任何帮助将不胜感激!

4

3 回答 3

11

鉴于您问题中的代码链接,问题似乎在这里:

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,但有两个不同的功能:CreateFileACreateFileW. 前者采用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

并选择“使用多字节字符集”,如下图所示:

在 VS2010 IDE 中设置多字节字符集

于 2015-06-12T15:21:56.137 回答
2

您在 Visual Studio 中的设置可能设置为 Unicode,但您正在编译的代码需要 ASCII。

转到项目属性 -> 配置属性 -> 常规 -> 字符集并选择“使用多字节字符集”。

-苏伦塔尔

于 2016-09-07T07:05:27.720 回答
1

您在 Visual Studio 中的设置可能设置为 Unicode,但您正在编译的代码需要 ASCII。

转到项目属性 -> 配置属性 -> 常规 -> 字符集,然后选择“使用多字节字符集”。

您还应该从 C++ -> Preprocessor -> Preprocessor 定义中删除UNICODE或删除_UNICODE,如果它们在那里定义的话。

这将使您的代码调用接受char字符串的 Windows API 函数的 ASCII 版本。

于 2015-06-12T14:33:56.593 回答