Как использовать Win32 API для связи с com-портом (RS232) - PullRequest
3 голосов
/ 17 марта 2011

Я пытаюсь использовать 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"), затем он без проблем компилируется.

Однако он возвращает «ОШИБКА, открывающая последовательный порт -1», поэтому он не может найти com-порт успешно. Я думаю, что прямое литье не правильный путь?

Пожалуйста, скажите мне, что я должен сделать, чтобы сделать эту работу.

MSDN не так уж полезен http://msdn.microsoft.com/en-us/library/ms810467.aspx

Я не знаю, что там означает "gszPort"

Ответы [ 2 ]

3 голосов
/ 18 марта 2011

Для сборки Unicode CreateFile отображается на CreateFileW, что предполагает "широкие" строки символов. Вы можете решить непосредственную проблему, добавив префикс вашей строковой константы к L, например:

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

Некоторые люди предлагают явно использовать широкую версию:

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

Или вы можете явно использовать версию "ANSI", даже в сборке Unicode:

CreateFileA("COM1", ...);

Если вы хотите иметь возможность строить сборки Unicode и ANSI, вы можете использовать макрос, который может включать префикс L. Существует две версии этого макроса: TEXT(x) и _T(x). Если я правильно помню, первое происходит из Windows API через <tchar.h>, а второе - из реализации Microsoft библиотеки времени выполнения C. Поскольку это Windows API, я бы использовал TEXT версию.

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

В настоящее время, вероятно, не стоит сохранять обратную совместимость для ANSI. Все версии Windows, выпущенные в последнее десятилетие, используют Юникод для внутреннего использования, поэтому, если вы попытаетесь использовать версии ANSI, строки будут расширены во время выполнения. Так что я не буду беспокоиться о макросах и просто добавлю префикс строковых литералов к L, за исключением особых случаев.

3 голосов
/ 17 марта 2011

Попробуйте _T("COM1") вместо LPCWSTR("COM1"). Он называется Отображение общего текста . На самом деле я не знаю, в этом ли проблема, но использование _T - верный путь.

Кроме того, когда вызовы Windows API возвращают условие ошибки (например, -1 ), вы можете использовать Код последней ошибки (используя GetLastError и FormatMessage) , чтобы получить более подробное описание ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...