boost asio serial_port_service和serial_port有什么区别

时间:2014-10-25 13:35:27

标签: c++ serial-port boost-asio

我将实现(希望)强大的异步串行rs232数据传输(通过USB) - 用于Windows和Linux,包括esp。那个漂亮的嵌入式系统叫做beagle bone black。

最后,我只是希望能够(兼容地)将rs232与强大的截止时间超时,取消()重置()等对话,以便在例如时不崩溃/挂起。 tx或rx线路意外断开。当然,我可以简单地复制/粘贴/采用现有的例子。但我也希望变得更加开明; - )

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

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

class serial_port_service : public io_service::service

basic_serial_port - 提供串行端口功能。

template< typename SerialPortService = serial_port_service>
class basic_serial_port :
  public basic_io_object< SerialPortService >,
  public serial_port_base

我发现,我需要一个boost::asio::io_service来构建boost::asio::serial_portserial_port_service。 我想我已经理解了asio如何完成这项工作的基本方法,例如在this examples

确定serial_port_service派生自io_service,其ctor采用io_service,其界面也提供basic_serial_port的成员函数。

对我而言,它看起来像是一个io_service,它也实现了basic_serial_port - 这两个类的原因是什么?什么时候使用另一个?不确定可能的用例,以及这个serial_port typedef怎么样。也许(很明显)我错过了一些东西 - 有人能给我更多的光吗?

1 个答案:

答案 0 :(得分:4)

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


各种类用于分离职责和抽象。名称的相似性可能令人困惑,因此文档在命名时要非常小心。 documentation州:

  

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对象,提供执行串行端口相关操作的接口。实施非常基础:
    • 确定如何将信息返回给调用者:如果发生错误则抛出,填充std::future,暂停coroutine等。
    • 将实际工作推迟到serial_port_service,即其I / O服务。
    • 提供RAII语义。当serial_port被销毁时,它将取消未完成的异步操作并关闭serial_port
  • serial_port_service是I / O服务:
    • 它提供抽象并实现特定于平台的API。
    • 在使用相同serial_port的{​​{1}}之间共享。使用io_service创建serial_port时,io_service将使用已注册serial_port的现有serial_port_service或创建并注册新io_service使用serial_port_service
    • 它充当I / O对象implementation的工厂。对于io_service,这可能是基本文件描述符或句柄。