Количество записанных байтов равно 0, хотя getOverlappedResult возвращает 1 - PullRequest
3 голосов
/ 27 июня 2019

Я пытаюсь записать шестнадцатеричные данные в мой последовательный порт. Однако, хотя GetOverlappedResult возвращает true, количество отправленных байтов всегда равно 0, несмотря на то, что я отправил 1, 2 или 8 байтов.

Я могу открыть / закрыть порт и получать шестнадцатеричные сообщения. Я просто не могу понять, как записать данные в мой последовательный порт, чтобы их мог использовать другой виртуальный последовательный порт.

Я ссылался на проект TimeReader, который коллега нашел в Интернете. Я протестировал порты с виртуальными последовательными портами, используя утилиту последовательного порта, и сумел успешно установить связь между ними. Поиск в Интернете не помог мне полностью решить проблему.

Как создать ручку:

serialPortHandle = CreateFile(("COM2"),
        GENERIC_READ | GENERIC_WRITE,
        0,
        NULL,
        OPEN_EXISTING,
        FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING,
        NULL);

Как я создаю свои данные:

typedef struct
{
    int len;
    char data[1];
}Message;

(и позже в моей основной функции)

    message.len = 8;
    message.data[0] = 0x30;

Как я вызываю WriteFile:

    OVERLAPPED osWriteS = { 0 };
    osWriteS.Offset = 0;
    osWriteS.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

    DWORD bytesSent;

    _cprintf("message: %x\r\n", message.data[0]);
    _cprintf("message len: %i\r\n", message.len);

    if (WriteFile(serialPortHandle, message.data, message.len, &bytesSent, &osWriteS) == false)
    {
        _cprintf("bytes sent before overlap: %x\n", bytesSent);

        if (GetLastError() != ERROR_IO_PENDING)
        {
            _cprintf("Failed to send message\n");
            return;
        }
        else
        {
            bool _overlappedResult = GetOverlappedResult(serialPortHandle, &osWriteS, &bytesSent, TRUE);
            _cprintf("overlapped: %x\n", _overlappedResult);
            _cprintf("bytes: %x\n", bytesSent);
        }
    }


    if (bytesSent != message.len)
    {
        _cprintf("Failed to send complete message\n");
        return;
    }

Печать GetOverlappedResult возвращает значение 1, но bytesSent = 0 несмотря на сообщение, содержащее 1 byte, и не было получено никаких данных от другого последовательного порта, ожидающего отправки данных.

Может ли кто-нибудь помочь мне разобраться в проблеме? Спасибо!

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