boost asio serial_port_service和serial_port有什么区别

tve*_*lke 4 c++ serial-port boost-asio

我要为Windows和Linux(包括esp)实现(希望)健壮的异步串行rs232数据传输(通过USB)。那个很好的嵌入式系统叫做beagle bone black。

最后,我只想(兼容)说出具有鲁棒的截止时间超时,cancel()reset()等的rs232,以免在例如tx或rx线路意外断开连接时崩溃/挂起。可以肯定的是,我可以简单地复制/粘贴/采用现有示例。但我也想变得更开明;-)

我决定使用boost:asio :: serial_port。现在,在阅读文档时,我对这两个类感到困惑(其中三个与typedef serial_port相对):

serial_port_service-串行端口的默认服务实现。

class serial_port_service : public io_service::service
Run Code Online (Sandbox Code Playgroud)

basic_serial_port-提供串行端口功能。

template< typename SerialPortService = serial_port_service>
class basic_serial_port :
  public basic_io_object< SerialPortService >,
  public serial_port_base
Run Code Online (Sandbox Code Playgroud)

我知道,我非常高兴,因此我需要boost::asio::io_service构造boost::asio::serial_portserial_port_service。我想我已经了解asio如何完成这项工作的基本方法,例如在本示例中所说的。

OK serial_port_service源自io_service,其ctor接受一个io_service,并且其接口还提供的那些memberfuncs basic_serial_port

对我来说,这似乎是同时实现了basic_serial_port的io_service-拥有这两个类的原因是什么?什么时候使用另一个?不确定可能的用例,以及这种serial_porttypedef。也许(很明显)我想念什么-有人可以给我更多的光吗?

Tan*_*ury 5

通常,应用程序应使用I / O对象。在这种情况下,该值为boost::asio::serial_port


各种类用于分隔职责和抽象。名称的相似性可能会造成混淆,因此文档在命名时非常小心。该文档指出:

io_service实现可扩展的,类型安全的,多态的I / O服务集,并按服务类型索引。io_service必须先初始化类的对象,然后才能使用I / O对象(例如套接字,解析器和计时器)。这些I / O对象的特征在于具有接受io_service&参数的构造函数。

存在一些I / O服务,它们代表I / O对象管理与操作系统的逻辑接口。特别是,有些资源在I / O对象类之间共享。例如,可以根据单个计时器队列来实现计时器。I / O服务管理这些共享资源。

要在串行端口的上下文中对此进行解释:

  • io_service提供了一个事件处理循环和管理I / O服务,如serial_port_service
  • serial_port是一个I / O对象提供接口以执行串行端口相关的操作。实现是非常基本的:
    • 确定如何将信息返回给调用方:如果发生错误,则抛出该异常,填充a std::future,暂停协程等。
    • 将实际工作推迟到serial_port_service其I / O服务。
    • 提供RAII语义。当serial_port被破坏,它会取消未完成的异步操作,然后关闭serial_port
  • serial_port_service是一项I / O服务:
    • 它提供了一个抽象并实现了平台特定的API。
    • 它在serial_port使用相同的之中共享io_service。当serial_port与一个创建io_service时,serial_port将使用现有serial_port_service注册到io_service或创建并注册新serial_port_serviceio_service
    • 它充当I / O对象的工厂implementation。对于serial_port,这可能是基本文件描述符或句柄。