【问题标题】:How to use Win32 API to talk to a com port (RS232)如何使用 Win32 API 与 com 端口 (RS232) 通信
【发布时间】:2011-03-17 20:48:56
【问题描述】:

我正在尝试使用 win32 API 与 com 端口通信 我找到了这个 http://www.robbayer.com/files/serial-win.pdf

hSerial = CreateFile("COM1",
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);

我使用 VS2008,但它抱怨 错误 C2664:“CreateFileW”:无法将参数 1 从“const char [5]”转换为“LPCWSTR”

好吧,我猜它不喜欢 "COM1" 是 char* 类型,

我尝试将其转换为 LPCWSTR("COM1"),然后编译没有问题。

但是,它返回“ERROR opening serial port -1”,所以没有成功找到com口。我想直接投射不是正确的方法?

请告诉我我应该怎么做才能完成这项工作。

msdn 没那么有用 http://msdn.microsoft.com/en-us/library/ms810467.aspx

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

【问题讨论】:

    标签: windows winapi serial-port


    【解决方案1】:

    尝试使用_T("COM1") 而不是LPCWSTR("COM1")。它被称为Generic-Text Mapping。我实际上不知道这是否是问题,但使用_T 是正确的方法。

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

    【讨论】:

    • 嗨,Michael,_T("COM1") 给出了未找到的错误标识符,我应该包含一些头文件吗? TEXT("") 对我有用
    • +1 迈克尔。阿尔弗雷德,您在该符号中缺少下划线。 _T("COM1") 在 UNICODE 构建下,_T("") 映射到 L"",这是 TEXT("") 映射到的,这就是为什么它适合你;在 MBCS/ANSI 构建下, _T("") 映射到 "" 这就是为什么您的原始函数不适合您的原因,因为 Windows 函数映射到接受 Ansi 或 Unicode 字符串的 A/W 版本,具体取决于构建目标是否是否为 UNICODE。
    • 嗨迈克尔,我尝试了_T和__T,没有运气,我猜是unicode问题,稍后再试。非常感谢!
    【解决方案2】:

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

    CreateFile(L"COM1", ...);
    

    有些人会明确建议使用宽版本:

    CreateFileW(L"COM1", ...);
    

    或者您可以显式使用“ANSI”版本,即使在 Unicode 版本中:

    CreateFileA("COM1", ...);
    

    如果您希望能够构建 Unicode 和 ANSI 构建,您可以使用可选地包含 L 前缀的宏。此宏有两个版本:TEXT(x)_T(x)。如果我没记错的话,前者来自<tchar.h> 的Windows API,后者来自微软对C 运行时库的实现。由于这是一个 Windows API,我会使用 TEXT 版本。

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

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

    【讨论】: