boost asio串口编程问题:serial_port如何重新打开串口?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了boost asio串口编程问题:serial_port如何重新打开串口?相关的知识,希望对你有一定的参考价值。
我在自定义的类serial_server中声明了一个变量:serial_port m_serial;
在构造函数中初始化该变量。初始化后,该串口就被打开了。
如果我调用m_serial.close(),该串口就被关闭。但是如果我再次打开该串口,我该调用什么函数?
试试看,或许 还要 参数本回答被提问者采纳
boost Asio网络编程简介
1 Asio介绍
在进行网络编程之前,我们先对Asio进行简单的介绍。首先Asio这个名字就说明了它的核心作用——异步输入/输出(Asynchronous input/output).也是就是说这个库设计的目的是让C++异步地处理数据且独立于平台,并不只是针对网络编程而已,只是它主要被应用于网络编程。除了网络编程以外他还包含了其他的IO功能。
异步数据处理就是指任务触发后不需要等待它们完成。相反,Boost.Asio会在任务完成时触发一个应用。异步任务的主要优点在于,在等待任务完成时不需要阻塞应用程序,可以去执行其它任务。异步任务的典型例子是网络应用。即在数据发送完毕后我们需要知道数据是否发送成功,异步通信可以让我们不必等待发送数据返回的结果。Boost.Asio将这个过程分成两个单独的步骤:第一步是作为一个异步任务开始传输数据。一旦数据传输完成,无论成功与否,应用程序会在第二步中国得到相关的结果通知。
2 I/O服务与I/O对象
使用Boost.Asio 进行异步数据处理的应用程序基于两个概念:I/O服务和IO/对象。I/O服务抽象了操作系统的接口,运行第一时间进行异步数据处理,而I/O对象则用于初始化特定的操作。鉴于Boost.Asio值提供了一个名为 boost::asio::io_service
的类作为I/O服务,它针对所支持的每一个操作系统分别实现了优化的类,另外库中还包含了针对不同I/O对象的几个类。其中,类 boost::asio::ip::tcp::socket
用于通过网络发送和接收数据,而类 boost::asio::deadline_timer
则提供了一个计时器,用于测量某个固定时间点到来或是一段指定的时长过去了。下面给出了一个计时器的例子,因为相较于其他I/O对象而言,它不需要任何有关网络编程的知识。
在main()中首先定义了一个I/O服务 io_service
,用于初始化I/O对象timer.就像本例中 deadline_timer
一样,所有I/O对象都需要一个I/O服务作为他们的构造函数的第一个参数。timer的第二个参数是时间用于指定定时的时长。这里通过调用 async_wait
来实现异步通信,其参数为回调函数的句柄值。这里的程序并不会阻塞在这里等待定时结束,而是立刻往下执行(这里打印waiting).如果我们使用的是 wait
函数则会阻塞在这里。最后程序又调用了I/O服务的 run()
方法,这是必须的,因为控制权必须被操作系统接管,才能在五秒之后调用 hander()
函数。 注意run()方法是阻塞的 ,在程序运行到这里时会"停止执行"。这一点挺有讽刺意味的,即在许多操作系统中都是通过阻塞来支持异步操作。在本例中如果run方法不是阻塞的,那可能在异步通信回调函数调用之前程序就运行完毕结束了。在调用完run后程序会继续向下运行,为了防止程序结束这里调用了一个暂停函数,方便观察结果。
这里我们可能会提出一些问题,比如如果异步程序是通过run方法的阻塞来完成的,那么多个异步程序怎么执行?如果不希望线程阻塞应该怎么做?为了深刻的了解run的工作原理,我们首先看一下下面这个例子:
这这里例子中可以看到多个异步通信可以基于同一个I/O服务。当然我们也可以为每一个异步通信都建立一个I/O服务,不过之前说过ioService.run是会阻塞程序的,我们必须要让回调函数先执行的I/O服务的run方法先执行(这里等待3秒异步通信)。即: