boost asio串口编程问题:serial_port如何重新打开串口?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了boost asio串口编程问题:serial_port如何重新打开串口?相关的知识,希望对你有一定的参考价值。

我在自定义的类serial_server中声明了一个变量:serial_port m_serial;
在构造函数中初始化该变量。初始化后,该串口就被打开了。
如果我调用m_serial.close(),该串口就被关闭。但是如果我再次打开该串口,我该调用什么函数?

参考技术A open()需要一个参数,字符串参数,如“COM1” 参考技术B 没有 m_serial.open() 这样的 函数吗?

试试看,或许 还要 参数本回答被提问者采纳

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对象而言,它不需要任何有关网络编程的知识。

#include <boost/asio.hpp>
#include <iostream>
 
void Handler(const boost::system::error_code &ec)
{
    std::cout<<"3 s."<<std::endl;
}
 
int main()
{
    boost::asio::io_service ioService;
    boost::asio::deadline_timer timer(ioService,boost::posix_time::seconds(3));
    timer.async_wait(Handler);
    std::cout<<"waiting..."<<std::endl;
    ioService.run();
 
    system("pause");        //程序暂停
    return 0;
}

在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的工作原理,我们首先看一下下面这个例子:

#include <boost/asio.hpp>
#include <iostream>
 
void Handler1(const boost::system::error_code &ec)
{
    std::cout<<"2 s."<<std::endl;
}
 
void Handler2(const boost::system::error_code &ec)
{
    std::cout<<"4 s."<<std::endl;
}
 
int main()
{
    boost::asio::io_service ioService;
    boost::asio::deadline_timer timer1(ioService,boost::posix_time::seconds(2));
    timer1.async_wait(Handler1);
    //timer1.wait();        //阻塞等待
    boost::asio::deadline_timer timer2(ioService,boost::posix_time::seconds(4));
    timer2.async_wait(Handler2);
    std::cout<<"waiting..."<<std::endl;
    ioService.run();
 
    system("pause");        //程序暂停
    return 0;
}

这这里例子中可以看到多个异步通信可以基于同一个I/O服务。当然我们也可以为每一个异步通信都建立一个I/O服务,不过之前说过ioService.run是会阻塞程序的,我们必须要让回调函数先执行的I/O服务的run方法先执行(这里等待3秒异步通信)。即:

boost::asio::io_service ioService1;
boost::asio::io_service ioService2;
boost::asio::deadline_timer timer1(ioService1,boost::posix_time::seconds(2));