ReadFile() 说失败,但错误代码是 ERROR_SUCCESS

2023-11-29

我在用着ReadFile()在 Windows 上从串行端口读取数据。这段代码在某个时间点工作得很好,但现在失败了,我正在尝试找出问题的根源,所以我怀疑这是串行配置或超时的问题,因为这些都没有改变。

ReadFile()返回 false,表明发生错误。但是,当我立即检查值时GetLastError(),它返回 0,即ERROR_SUCCESS。读取的字节数为0,所以我倾向于认为确实有一些东西has出了问题,但是这个错误代码完全没用。

有任何想法吗?谢谢。

编辑:以下是一些相关的代码片段:

#define GPS_COM_PORT L"COM3"

// for reference, the device communicates at 115200 baud,
// no parity, 1 stop bit, no flow control

// open gps com port
hGpsUart = CreateFile(GPS_COM_PORT, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (hGpsUart == INVALID_HANDLE_VALUE)
{
    if (GetLastError() == ERROR_FILE_NOT_FOUND)
    {
        msg.setText("GPS COM port does not exist!");
        msg.exec();
        QApplication::quit();
    }

    msg.setText("Error occurred while trying to open GPS COM port!");
    msg.exec();
    QApplication::quit();
}

// set gps com port settings
dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
if (!GetCommState(hGpsUart, &dcbSerialParams))
{
    msg.setText("Could not get GPS COM port settings!");
    msg.exec();
    QApplication::quit();
}
dcbSerialParams.BaudRate = CBR_115200;
dcbSerialParams.ByteSize = 8;
dcbSerialParams.StopBits = ONESTOPBIT;
dcbSerialParams.Parity = NOPARITY;
if (!SetCommState(hGpsUart, &dcbSerialParams))
{
    msg.setText("Could not set GPS COM port settings!");
    msg.exec();
    QApplication::quit();
}

// set gps com port timeouts
timeouts.ReadIntervalTimeout = MAXDWORD;
timeouts.ReadTotalTimeoutConstant = 0;
timeouts.ReadTotalTimeoutMultiplier = 0;
timeouts.WriteTotalTimeoutConstant = 50;
timeouts.WriteTotalTimeoutMultiplier = 10;
if (!SetCommTimeouts(hGpsUart, &timeouts))
{
    msg.setText("Could not set GPS COM port timeouts!");
    msg.exec();
    QApplication::quit();
}

// ... later in the code ...

char buf[161] = {0};
DWORD bytes_read = 0;

// This returns false...
if (!ReadFile(hGpsUart, buf, 160, &bytes_read, NULL)) 
{
    // Yet in here, GetLastError() returns ERROR_SUCCESS (0)
    QMessageBox msg;
    msg.setText("Error reading from GPS UART!");
    msg.exec();
}

我认为您观察的关键是您的来源中的短语“然而在这里,GetLastError() 返回 ERROR_SUCCESS (0)”

对 GetLastError 的调用必须是(大概)失败的调用之后进行的下一个 Win32 调用。作为实验,尝试在失败处理程序中显式调用 GetLastError(),但在消息框调用之前。我怀疑您会看到真正的故障代码。

祝你好运!

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

ReadFile() 说失败,但错误代码是 ERROR_SUCCESS 的相关文章

  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 自定义波特率,redux

    我遇到的问题详述如下自定义波特率 https stackoverflow com questions 7714060 custom baud rate SetCommState 波特率 921600 失败 但波特率 115200 成功 尽管
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 如何使用来自 Microsoft-Windows-NDIS-PacketCapture 提供程序的实时 ETW 事件?

    更大的问题是一般如何使用实时 ETW 网络堆栈事件 但我特别感兴趣Microsoft Windows NDIS PacketCapture 提供程序 所有其他网络堆栈提供程序都部分工作 但 NDIS PacketCapture NDIS P
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况

随机推荐

  • Facade 和 Mediator 设计模式的区别?

    外观设计模式和中介设计模式有什么区别 我想了解在哪种情况下在这两种设计模式之间选择哪种设计模式 我浏览了以下链接 发现两者在用例方面都是相同的 立面设计模式 http www tutorialspoint com design patter
  • Java 使用 XStream 读取 XML

    我正在尝试使用 XStream 反序列化此 XML 文件 但收到此错误 Exception in thread main com thoughtworks xstream converters ConversionException Aut
  • 创建二维列表矩阵

    如何创建基于列表的矩阵1具有给定的行数和列数 例如 像 row 3 column 4 gt 1 1 1 1 1 1 1 1 1 1 1 1 这是使用列表理解的替代方法 让我们看一下基础知识 Prelude gt 2 x x lt 1 4 2
  • Asp.net MVC Razor如何显示两个模型字段的分组单选按钮

    我有一个简单的测验模型 我试图让用户从强类型视图中分组的两个单选按钮中选择正确答案 替代答案 但我使用的 lambda 表达式不起作用 我得到两个空白的单选按钮 我在这里和网上查看了几个问题 但我的模型是 IList 并且我找不到合适的示例
  • 如何根据下拉框 #1 的输入更改下拉框 #2?

    我有两个下拉菜单
  • 在 Eclipse 中运行 gtkmm 项目时出现“Gtk-WARNING **:无法打开显示:”

    我正在尝试在 Eclipse CDT 在 Ubuntu 上 中运行 gtkmm 项目 该项目编译正常 没有报告错误 但是当我尝试运行该项目时 控制台打印出此消息 Gtk WARNING cannot open display 如果我转到可执
  • Leaflet - 将控件放在 div 地图之外

    我制作了以下应用程序 http lae2 alwaysdata net carte exppng 我想将我的两个控件 leaflet control zoom 和 leaflet control layers 放在 div 地图之外 例如
  • 如何通过 C# 获取 Azure Log Analytics 工作区的工作区 ID

    如何通过 C 获取 Azure 中 Log Analytics 工作区的工作区 ID 从那以后我发现OperationalInsightsManagementClient也可以使用类 var client new OperationalIn
  • 如何在 mule 4 中将 ManagedCursorStreamProvider 转换为 JSOn 对象

    如何在 mule 中将 ManagedCursorStreamProvider 转换为 Json 对象 我写了一个java方法 它将Json对象作为输入 Request Payload a one b two 调用静态 arg0 paylo
  • Transformers PreTrainedTokenizer add_tokens 功能

    参考文档在 Huggingface 的很棒的变形金刚库中 我发现了add tokens功能 tokenizer BertTokenizer from pretrained bert base uncased model BertModel
  • 如何在QTableWidget中显示点击QPushButton的行

    我想删除行QPushButton被点击怎么可能我认为使用插槽是合理的 但如何做到这一点不知道 如果您有任何想法如何获取一行选定的按钮请分享 谢谢 这是我的桌子 这是我向 QTableWidget 添加行的代码 MainWindow Main
  • 使用本地图像在Windows Phone 8.1的webview中显示

    我在 Windows Phone 8 1 中创建了混合应用程序 我的一个页面使用了 webview 控件 它上面有一个 img 元素 我有一个小图像作为我的应用程序构建的一部分 复制到输出目录 设置为 始终复制 我已按照此页面的说明进行操作
  • 什么是软件框架? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 有人可以解释一下什么是软件框架吗 为什么我们需要一个框架 框架如何使编程变得更容易 我很
  • php 中 at-sign 的有效用例

    at 符号用于隐藏错误消息 据我所知 绝对没有使用它的用例或借口 您可以通过更改 php ini 设置来隐藏生产中的错误 同时仍将错误输出到日志文件 符号使其他程序员很难确定问题出在哪里 当您开发时 错误消息是您的朋友 快速发现错误并修复它
  • 需要列出 SQL Server 数据库中的所有触发器以及表名称和表架构

    我需要列出 SQL Server 数据库中的所有触发器以及表名称和表架构 我就快到了 SELECT trigger name name trigger owner USER NAME uid table schema table name
  • 有什么办法可以拯救脏画布吗?

    我正在使用 HTML5 画布制作视频屏幕截图 视频托管在其他地方 除了 toDataURL 之外一切正常 因为画布很脏 所以 我想知道 有什么办法可以将这个画布图像保存在计算机上吗 我认为答案是否定的 但希望有一些黑客来完成这件事 除了将视
  • Hangfire 激活器未处理

    我遇到了 Hangfire 无法在 NET 5 上的 WebApi 中处理它实例的对象的问题 这是我在 ConfigureServices 中的配置 非常标准 顺便说一句 services AddScoped
  • Slim 框架/公共文件夹重定向

    我正在使用 Slim Framework v3 我已经设置了 API 如果我访问它可以顺利工作http localhost 8080 slimapp public 我有默认的目录结构 我的示例 API 端点是http localhost 8
  • 为什么“Range(...).End(xlDown).Row”返回 1048576?

    我想在 VBA 的 for 循环中复制一些值 因此我通过以下方式计算限制 For iCounter 1 To Range End xlDown Row Range Row 1 Sadly Range End xlDown Row回报1048
  • ReadFile() 说失败,但错误代码是 ERROR_SUCCESS

    我在用着ReadFile 在 Windows 上从串行端口读取数据 这段代码在某个时间点工作得很好 但现在失败了 我正在尝试找出问题的根源 所以我怀疑这是串行配置或超时的问题 因为这些都没有改变 ReadFile 返回 false 表明发生