我将实现(希望)强大的异步串行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_port
或serial_port_service
。
我想我已经理解了asio如何完成这项工作的基本方法,例如在this examples
确定serial_port_service
派生自io_service,其ctor采用io_service
,其界面也提供basic_serial_port
的成员函数。
对我而言,它看起来像是一个io_service,它也实现了basic_serial_port - 这两个类的原因是什么?什么时候使用另一个?不确定可能的用例,以及这个serial_port
typedef怎么样。也许(很明显)我错过了一些东西 - 有人能给我更多的光吗?
答案 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服务。serial_port
被销毁时,它将取消未完成的异步操作并关闭serial_port
。serial_port_service
是I / O服务:
serial_port
的{{1}}之间共享。使用io_service
创建serial_port
时,io_service
将使用已注册serial_port
的现有serial_port_service
或创建并注册新io_service
使用serial_port_service
。implementation
的工厂。对于io_service
,这可能是基本文件描述符或句柄。