尽管getOverlappedResult返回1,但写入的字节为0

时间:2019-06-27 10:09:05

标签: c++ windows serial-port 64-bit

我正在尝试将十六进制数据写入我的串行端口。但是,尽管GetOverlappedResult返回true,但是尽管我发送了1或2或8个字节,但发送的字节数始终为0。

我能够打开/关闭端口并接收十六进制消息。我只是不知道如何将数据写入我的串行端口,以使其被另一个虚拟串行端口提取。

我引用了一个同事在网上找到的“ 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仍然返回let array = [String].self -> Array<String>.Type let element = array.Element.self -> String.Type JSONDecoder().decode(element, from: data) -> works fine func foo<T>(type: T.Type) where T: Decodable{ let element = type.Element -> Error. How to get element here? JSONDecoder().decode(element, from: data) } foo(array) ,并且没有从其他串行端口接收到等待该值发送的数据数据。

有人可以帮助我提供有关该问题的见解吗?谢谢!

0 个答案:

没有答案