有没有办法检查有多少字节可供读取?

问题描述 投票:0回答:1

我一直在研究一些涉及 Win32 API 和串行通信的东西。我已经设法弄清楚如何打开一个 COM 端口,并对其进行写入/读取,但我想知道是否有一种方法可以查看有多少字节和/或字符可供读取。 我在想也许

GetFileSizeEx()
功能会起作用,但它看起来不像。

我不完全确定这个问题是否非常清楚(关于我在寻找什么)所以只是举一个更明显的例子,我希望找到像 Arduino 的

Serial.available()
功能

到目前为止,这是我的代码

#include <Windows.h>
#include <iostream>
#include <string>

int main() {
    HANDLE hFile;
    hFile = CreateFile("COM4",
        GENERIC_READ | GENERIC_WRITE,
        0,
        0,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        0);

    if(hFile == INVALID_HANDLE_VALUE) {
        std::cout << "bad handle" << std::endl;
        return 0;
    }
    DCB cerialParams = {0};
    cerialParams.DCBlength = sizeof(cerialParams);
    if(!GetCommState(hFile, &cerialParams)) {
        // error, but I'm too lazy to handle it.
        return 0;
    }

    cerialParams.BaudRate = CBR_9600;
    cerialParams.ByteSize = 8;
    cerialParams.StopBits = ONESTOPBIT;
    cerialParams.Parity = NOPARITY;

    if(!SetCommState(hFile, &cerialParams)) {
        // read above
        return 0;
    }

    COMMTIMEOUTS timeouts = {0};
    timeouts.ReadIntervalTimeout = 500;
    timeouts.ReadTotalTimeoutConstant = 500;
    timeouts.ReadTotalTimeoutMultiplier = 10;

    timeouts.WriteTotalTimeoutConstant = 500;
    timeouts.WriteTotalTimeoutMultiplier = 10;

    if(!SetCommTimeouts(hFile, &timeouts)) {
        // do it again
        return 0;
    }
    
    BOOL success = 0;
    PLARGE_INTEGER fSizeStruct{0};
    //I've noticed that after I try to run this function, printing to the console no longer seems to work, oh well.
    success = GetFileSizeEx(hFile, fSizeStruct);
    std::cout << '"' << fSizeStruct << '"' << std::endl;
    std::cout << success;

    CloseHandle(hFile);
    return 0;
}
c++ winapi serial-port
1个回答
0
投票

您可以使用

ClearCommError

检索有关通信错误的信息并报告通信设备的当前状态

它填充的COMSTAT结构有一个

cbInQue
成员:

串行提供程序接收但尚未被

ReadFile
操作读取的字节数。

相关阅读(在 Delphi 中,但在这里仍然适用):

读取前获取串口等待的字节数

© www.soinside.com 2019 - 2024. All rights reserved.