Win32 API:如何读取序列号,或者如果不是数据则在超时内退出

2024-05-11

我需要一个函数来从串行端口读取数据,或者如果在时间间隔内没有数据则返回。例如。在 GNU/Linux 上你可以使用poll()orselect()+read()。 Windows 中有类似的东西吗?

下面是我尝试过的:它应该可以工作,但是功能获取重叠结果() http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms683209(v=vs.85).aspx要么有问题,要么没有很好的文档记录;它没有报告任何内容,而不是读取的字节数(甚至不是零,例如,如果我不初始化lpNumberOfBytesTransferred参数,它只是包含垃圾).

// NOTE: the `file` should be opened in non-blocking mode
long ReadData(HANDLE file, char* buf, long szbuf, int msTimeout){
    OVERLAPPED ReadState = {0};
    ReadState.hEvent = CreateEvent(0, true, false, "☠");
    if (!ReadState.hEvent){
        PrintLastErr();
        return -1;
    }
    unsigned long BytesRead = 0; //number of bytes was read
    if (!ReadFile(file, buf, szbuf, &BytesRead, &ReadState)){
        // This creates a reading event. Below we wait for it to complete, and cancel on timeout
        if (GetLastError() != ERROR_IO_PENDING){
            PrintLastErr();
            return -1;
        }
        // No, I can't use WaitForSingleObject(), it exits with disregard to whether
        // reading is ongoing or no more data left (e.g. in case of a serial port).
        while(1) {
            std::this_thread::sleep_for(std::chrono::milliseconds( msTimeout ));
            unsigned long ret;
            puts("Getting result");
            if (!GetOverlappedResult(file, &ReadState, &ret, false)
                && GetLastError() != ERROR_IO_INCOMPLETE){
                PrintLastErr();
                return -1;
            }
            printf("result is %lu\n",ret);
            if(ret == BytesRead){
                return BytesRead;
            }
            BytesRead = ret;
        }
    } else { //completed immediately
        printf("Bytes read %i\n");
        assert(BytesRead <= LONG_MAX);
        return (long)BytesRead;
    }
}

打开 COM 端口后调用 SetCommTimeouts。如果没有收到数据,这会将 ReadFile 设置为在一段时间间隔后返回。然后你只需调用 ReadFile 即可。不需要重叠或事件或 GetOverlappedResult。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Win32 API:如何读取序列号,或者如果不是数据则在超时内退出 的相关文章

随机推荐

  • 验证 asp.net mvc 中的下拉列表

    in controller ViewBag Categories categoryRepository GetAllCategories ToList in view Html DropDownList Cat new SelectList
  • XAMPP apache 服务器在 Skype 安装后未启动

    我收到以下控制台日志 1 14 33 PM apache Possible problem detected 1 14 33 PM apache Port 80 in use by c program files x86 skype pho
  • 从纵向旋转到横向时的字体大小问题

    解决了它 webkit text size adjust 100 Prevent font scaling in landscape while allowing user zoom 从纵向旋转到横向时 我遇到了一个小的字体大小问题 在 s
  • 通过 :: 调用包中的函数是一个好习惯吗

    我正在编写一些 R 函数 这些函数在其他包中使用一些有用的函数 例如stringr and base64enc 不打电话好不好library or require 首先加载这些包但要使用 直接引用我需要的功能 比如stringr str m
  • 数组扩展以按值删除对象

    extension Array func removeObject
  • Silverlight WCF服务跨域问题

    我有一个 silverlight 应用程序 托管在 Intranet mydomain net 和一个 WCF 服务 webservices mydomain net 我需要跨站点策略文件吗 如果是这样 只允许从 Intranet mydo
  • 事务管理器未回滚 Spring Batch 作业

    我遇到一个挑战 我需要从 SQL Server 数据库读取 未处理 的数据 处理数据 然后有选择地更新 DB2 数据库中的两到六个表 然后将该数据标记为在 SQL Server 上的原始数据库中已处理 在任何时候 如果出现任何问题 我希望回
  • 在 C++ 中创建观察者设计模式的好方法

    我正在尝试用 C 实现观察者设计模式 如下所示 include
  • CAShapeLayer 路径在动画后消失 - 需要它留在同一个地方

    感谢 StackOverflow 上的一些帮助 我目前正在 CAShapeLayer 中对路径进行动画处理 以制作一个从移动精灵指向屏幕上另一个移动点的三角形 动画完成后 三角形就会从屏幕上消失 我使用的持续时间非常短 因为每个精灵每 0
  • SDL 鼠标位置调整大小后裁剪

    我在 SDL 中的鼠标位置上遇到了一些奇怪的行为 如果我将窗口大小调整得更大 则任一鼠标事件的 x y 位置似乎都限制为原始窗口的宽度和高度 如果我缺少一些函数调用来告诉 SDL 鼠标区域的大小已增加 应用程序的相关部分 void Resi
  • Laravel 所有会话 ID 与 Redis 驱动程序

    在我的应用程序中 我希望允许某些用户能够注销除他 她之外的所有其他用户 当会话驱动程序设置为文件时 我已经完成了此功能 但现在我使用 redis 作为会话驱动程序 并且我无法找到任何方法来列出所有当前会话 就像我在文件时所做的那样司机 问题
  • 如何使用字符串参数来区分命名空间或类型?

    我需要在 NET 2 0 C 脚本中获取一些 JSON 输出 目标是使用一种方法来输出我需要的所有 JSON 提要 所有模型都具有相同的 id 和 name 属性 因此我有大约 15 个命名空间 它们在这里具有相同的部分 简而言之 因为我使
  • 如何声明文本字段只能包含整数?

    在 swift 中 我试图创建一个文本字段 该文本字段将允许启用按钮 但仅当文本字段包含整数时 我怎样才能做到这一点 两件事情 指定键盘类型以仅显示数字键盘 所以 设置keyboardType to numberPad 然而 这还不足以阻止
  • Powershell 调用程序集委托

    我有一个用于过程控制应用程序的 dll 程序集 我在我的内部使用 load电源外壳 script 该DLL包含我需要使用的委托类型 委托名称是 X Y Delegate 我在该 DLL 中有另一个方法 应该这样调用 Method deleg
  • 具有动态调整大小的 CSS 精灵

    我决定为我的整个网站 30 个图像 创建一个精灵表 这样我就可以加载 1 个图像并仅加载参考位置 从而减少图像加载时间和服务器调用 我的问题 是否可以引用 sprite 表中的图像 然后将该图像调整为其父容器的 100 例如 SomeDiv
  • MyBatis 映射中的复合键

    我无法将组合键传递给 MyBatis
  • 未经编辑,无法在 pptx 中的 BarChart 中查看 Apache POI 更新的数据值

    我有一个 pptx 模板 它只有一张用于测试目的的幻灯片 该幻灯片有一个简单的条形图 我可以通过在 pptx 文件上双击条形图来编辑条形图 并且可以更改 Sheet1 条形图数据表 中的值 并且我可以立即在条形图中看到更改 现在 我尝试使用
  • 无对等证书例外 - Volley 和具有自签名证书的 Android

    我正在尝试让我的应用程序通过 https 与我的服务器通信 由于我不想付费让受信任的 CA 签署我的服务器证书 解决方案是使用自签名证书 因此 我创建了 caconfig cnf 如下所示 ca default ca CA default
  • Gmail 菜单按钮

    我希望编写一个 Google 脚本来存档所有早于某个日期的电子邮件 在该脚本中 我将添加一个自定义按钮 就像在 Google Sheets 中一样 以便我可以运行我的脚本 Google 脚本中是否存在向 Gmail 中的 UI 添加菜单 按
  • Win32 API:如何读取序列号,或者如果不是数据则在超时内退出

    我需要一个函数来从串行端口读取数据 或者如果在时间间隔内没有数据则返回 例如 在 GNU Linux 上你可以使用poll orselect read Windows 中有类似的东西吗 下面是我尝试过的 它应该可以工作 但是功能获取重叠结果