我将实现一个(希望)强大的异步串行 rs232 数据传输(通过 USB) - 适用于 windows 和 linux,包括 esp。那个漂亮的嵌入式系统叫做 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

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

OK serial_port_service 派生自 io_service,它的构造函数接受一个 io_service ,它的接口(interface)也提供了 basic_serial_port 的那些成员函数。

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

最佳答案

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

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



要在串行端口的上下文中解释这一点:

  • io_service 提供事件处理循环并管理 I/O 服务,例如 serial_port_service
  • serial_port 是一个 I/O 对象,它提供了一个接口(interface)来执行串口相关的操作。实现是非常基本的:
  • 确定如何将信息返回给调用者:如果发生错误则抛出、填充 std::future 、挂起 coroutine 等。
  • 将实际工作推迟到 serial_port_service ,即它的 I/O 服务。
  • 提供 RAII 语义。当 serial_port 被销毁时,它将取消未完成的异步操作并关闭 serial_port
  • serial_port_service 是一个 I/O 服务:
  • 它提供了一个抽象并实现了平台特定的 API。
  • 它在使用相同 serial_portio_service 之间共享。当使用 serial_port 创建 io_service 时,serial_port 将使用注册到 serial_port_service 的现有 io_service 或使用 serial_port_service 创建和注册新的 io_service
  • 它用作 I/O 对象的 implementation 的工厂。对于 serial_port ,这可能是一个基本的文件描述符或句柄。
  • 关于c++ - boost asio serial_port_service 和 serial_port 有什么区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26562965/

    10-14 17:13