提升异步读/写失败,使用"系统资源不足,无法完成所请求的服务"

时间:2016-03-24 16:38:23

标签: c++ boost boost-asio

我(似乎)随机收到错误:

  

"系统资源不足,无法完成所请求的服务"

boost::asio::async_read_untilboost::asio::async_write与串行端口一起使用时。

将串口声明为:

boost::asio::serial_port mSerialPort;

发生此错误后,我尝试

try
{
    mSerialPort.cancel();
    mSerialPort.close();
}
catch(boost::system::system_error error)
{
    ;
}

其中一个(不确定哪个)挂起并且永不返回,甚至没有抛出异常。

一般来说,这个错误是什么意思?

有人遇到过这个问题吗?我应该调查任何方向吗?

编辑:

有问题的串口使用USB仿真器。

关于这个other SO Question,特别是Hans Passant的评论,这个错误是否可能与设备驱动程序有关?我使用与其他硬件组件相同的代码,从未得到过这种行为。

编辑2:

在网上搜索此特定错误消息时,通常建议按照此处所述增加分页池内存:

Microsoft Support Article

在我的案例中这样做有什么意义吗?

2 个答案:

答案 0 :(得分:0)

自从我使用Windows上的串行端口以来,已经很长很长时间了,所以请记住这一点。从历史上看,早在新的4.0天,大多数串行端口驱动程序从官方NT内核DDK指南中删除都无法正确执行异步i / o,并且会不时出现您的确切错误和/或锁定。解决方案是只使用串行i / o的同步i / o,它正常工作。如果基于USB的串行端口的驱动程序最初是古老的,它可能会复制此问题。

我还要确保您使用与已知工作模式相同的设计模式。请尝试http://www.ridgesolutions.ie/index.php/2012/12/13/boost-c-read-from-serial-port-with-timeout-example/作为示例。希望有所帮助。

答案 1 :(得分:0)

错误通常意味着主内存最大化,系统在交换机上分配内存,直到硬盘已满。根据程序运行的时间长短,可能会因内存泄漏而发生。

但是在你的情况下,在驱动程序级别发生了一些事情。您应该检查事件查看器,以防万一在那里报告(假设窗口)。

你能从串口取回任何东西吗?根据您的代码,如果没有发回任何内容,从端口读取将无限期阻止。

要尝试的事情:

  • 尝试一次阅读一个字符
  • 由于回调,线程等异步可能会很复杂。请尝试同步。
  • 设备是否通过同一模拟器连接您的代码?
  • 尝试增加您正在阅读的缓冲区
  • 仔细检查设备正在使用的协议
  • 仔细检查波特率

这是一个很棒的boost / asio资源(基于POSIX,但一般信息适用于所有平台):http://www.webalice.it/fede.tft/serial_port/serial_port.html