我将实现一个(希望)强大的异步串行 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_port
或 serial_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 服务。 serial_port
被销毁时,它将取消未完成的异步操作并关闭 serial_port
。 serial_port_service
是一个 I/O 服务:serial_port
的 io_service
之间共享。当使用 serial_port
创建 io_service
时,serial_port
将使用注册到 serial_port_service
的现有 io_service
或使用 serial_port_service
创建和注册新的 io_service
。 implementation
的工厂。对于 serial_port
,这可能是一个基本的文件描述符或句柄。 关于c++ - boost asio serial_port_service 和 serial_port 有什么区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26562965/