boost asio serial_port_service和serial_port有什么区别

What is the difference of boost asio serial_port_service and serial_port

本文关键字:serial port 什么 区别 boost service asio      更新时间:2023-10-16

我将实现一个(希望)强大的异步串行rs232数据传输(通过USB)-适用于windows和linux,尤其是名为beagle bone black的漂亮嵌入式系统。

最后,我只想能够(兼容地)使用强大的截止日期超时、cancel()reset()等与rs232对话,以避免在例如tx或rx线路意外断开时崩溃/挂起。当然,我可以简单地复制/粘贴/采用现有的示例。但我也想变得更开明;-)

我决定使用boost:asio::serial_port。现在,在阅读文档时,我对这两个类感到困惑(第三个类是typedefserial_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如何完成工作的基本方法,比如这个例子中的bespoken。

OK serial_port_service派生自io_service,它的ctor采用io_service,它的接口也提供了basic_serial_port的memberfunc。

对我来说,它看起来像是一个io_service,它还实现了一个basic_serial_port——两个类都有的原因是什么?什么时候用一个,什么时候用另一个?不确定可能的用例,以及这个serial_port typedef如何。也许(很明显)我错过了什么——有人能给我更多的光吗?

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


不同的类用于分离职责和抽象。名称的相似性可能会让人感到困惑,因此文档在命名时非常小心。文件说明:

io_service实现了一组可扩展的、类型安全的、多态的I/O服务,按服务类型进行索引。在使用诸如套接字、解析器和定时器之类的I/O对象之前,必须初始化类io_service的对象。这些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、挂起协程等
    • 将实际工作推迟到其I/O服务serial_port_service
    • 提供RAII语义。当serial_port被销毁时,它将取消未完成的异步操作并关闭serial_port
  • serial_port_service是一种I/O服务:
    • 它提供了一个抽象并实现了特定于平台的API
    • 它在使用相同CCD_ 21的CCD_ 20之间共享。当用io_service创建serial_port时,serial_port将使用注册到io_service的现有serial_port_service,或者用io_service创建并注册新的serial_port_service
    • 它充当I/O对象的implementation的工厂。对于serial_port,这可能是一个基本的文件描述符或句柄