Windows 如何使用Win32 API与com端口(RS232)通信

Windows 如何使用Win32 API与com端口(RS232)通信,windows,winapi,serial-port,Windows,Winapi,Serial Port,我正在尝试使用win32 API与com端口通信 我找到了这个 我使用VS2008,它会抱怨 错误C2664:“CreateFileW”:无法将参数1从“常量字符[5]”转换为“LPCWSTR” 好吧,我想它不喜欢“COM1”是char*type 我试着将它转换为LPCWSTR(“COM1”),然后它就可以编译了 但是,它返回“打开串行端口-1时出错”,因此无法成功找到com端口。我猜直接选角不是正确的方式 请告诉我该怎么做才能使这项工作顺利进行 msdn没有那么大的帮助 我不知道“gszP

我正在尝试使用win32 API与com端口通信 我找到了这个

我使用VS2008,它会抱怨 错误C2664:“CreateFileW”:无法将参数1从“常量字符[5]”转换为“LPCWSTR”

好吧,我想它不喜欢“COM1”是char*type

我试着将它转换为LPCWSTR(“COM1”),然后它就可以编译了

但是,它返回“打开串行端口-1时出错”,因此无法成功找到com端口。我猜直接选角不是正确的方式

请告诉我该怎么做才能使这项工作顺利进行

msdn没有那么大的帮助

我不知道“gszPort”在那里是什么意思

试试
\t(“COM1”)
而不是
LPCWSTR(“COM1”)
。它叫。我不知道这是否是问题所在,但使用
\t
是解决问题的正确方法


此外,当Windows API调用返回错误条件(如-1)时,您可以使用获取错误的更详细描述。

对于Unicode构建,
CreateFile
映射到需要“宽”字符串的
CreateFileW
。您可以通过在字符串常量前面加上L来解决眼前的问题,如下所示:

CreateFile(L"COM1", ...);
有些人会建议明确使用宽版本:

CreateFileW(L"COM1", ...);
或者,您可以显式使用“ANSI”版本,即使是在Unicode版本中:

CreateFileA("COM1", ...);
如果希望能够生成Unicode和ANSI版本,可以使用可选包含L前缀的宏。此宏有两个版本:
TEXT(x)
\u T(x)
。如果我没记错的话,前者来自Windows API,通过
,后者来自Microsoft的C运行时库实现。由于这是一个Windows API,我将使用
文本
版本

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

现在,保持ANSI的向后兼容性可能不值得。过去十年中发布的所有Windows版本都在内部使用Unicode,因此如果您尝试使用ANSI版本,字符串将在运行时加宽。因此,我不必担心宏,只需在字符串文本前面加上
L
,除非在非常特殊的情况下。

嗨,Michael,_t(“COM1”)给出了找不到的错误标识符,我应该包括一些头文件吗?文本(“”)适用于我+1迈克尔。艾尔弗雷德,你在那个符号里漏掉了一个下划线_T(“COM1”)在UNICODE构建下,T(“”)映射到L“”,这就是文本(“”)映射到的,这就是为什么它适合您;在MBCS/ANSI构建下,_T(“”)映射到“”,这就是为什么您的原始版本不适用于您,因为windows函数映射到A/W版本,该版本接受ANSI或Unicode字符串,具体取决于构建目标是否为Unicode。嗨,Michael,我尝试了_T和__T,运气不好,我猜是Unicode问题,稍后将尝试。谢谢!
CreateFile(TEXT("COM"), ...);