Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 异步读取串行端口_C++_Eclipse_Boost_Serial Port_Boost Asio - Fatal编程技术网

C++ 异步读取串行端口

C++ 异步读取串行端口,c++,eclipse,boost,serial-port,boost-asio,C++,Eclipse,Boost,Serial Port,Boost Asio,我试图从串行端口异步读取几个字节。目前我使用的代码(源代码是),只允许我读取1个字节,然后退出。如何获取它,使代码一直读取,直到串行端口中没有更多的传入数据?谢谢:) void foo() { boost::asio::io_服务io_svc; boost::asio::串行端口服务器端口(io\U svc,“/dev/ttyS0”); boost::asio::截止时间计时器超时(io\u svc); 未签名字符my_缓冲区[2]; bool数据_可用=错误; ser_port.async_r

我试图从串行端口异步读取几个字节。目前我使用的代码(源代码是),只允许我读取1个字节,然后退出。如何获取它,使代码一直读取,直到串行端口中没有更多的传入数据?谢谢:)

void foo()
{
boost::asio::io_服务io_svc;
boost::asio::串行端口服务器端口(io\U svc,“/dev/ttyS0”);
boost::asio::截止时间计时器超时(io\u svc);
未签名字符my_缓冲区[2];
bool数据_可用=错误;
ser_port.async_read_some(boost::asio::buffer(my_buffer)),
boost::bind(&读取回调,boost::ref(数据可用),
boost::ref(超时),boost::asio::占位符::error(),
boost::asio::占位符::字节数_transfer());
timeout.expires_from_now(boost::posix_time::seconds(30));
timeout.async_wait(boost::bind(&wait_回调,boost::ref(ser_端口),boost::asio::placeholders::error());
io_svc.run();
io_svc。
如果(!数据_可用)
{
ser_port.close();

cout在您的
read\u回调中
取消计时器,不开始新的读取。
那么,您希望ASIO做什么呢?您刚刚取消了所有处理程序,就像文档状态一样,当没有处理程序时,run方法将返回

因此,如果您希望获得的数据多于接收到的一个字节,您可以做两件事:
首先,只需向asio发出另一个调用,以从端口读取更多信息

void read_callback(bool& data_available, boost::asio::deadline_timer& timeout, const  boost::system::error_code& error, std::size_t bytes_transferred)
{
    if (error || !bytes_transferred)
    {
        // No data was read!
        data_available = false;
        return;
    }
    // do something with the data you just read
    ser_port.async_read_some(boost::asio::buffer(my_buffer),
        boost::bind(&read_callback, boost::ref(data_available),
                boost::ref(timeout),boost::asio::placeholders::error(),
                boost::asio::placeholders::bytes_transferred()));
    //restart your timer
    data_available = true;
}

或者您可以添加use
transfer\u至少
,以获得至少所需的数据量。

好的,太棒了。既然在这个函数中没有定义串行端口和缓冲区,那么我应该在main中初始化它吗?@user2554193您可以在main中这样做,并将指向端口/缓冲区的指针传递给回调。或者您将一个类作为成员放入并绑定一个成员函数。
void read_callback(bool& data_available, boost::asio::deadline_timer& timeout, const  boost::system::error_code& error, std::size_t bytes_transferred)
{
    if (error || !bytes_transferred)
    {
        // No data was read!
        data_available = false;
        return;
    }
    // do something with the data you just read
    ser_port.async_read_some(boost::asio::buffer(my_buffer),
        boost::bind(&read_callback, boost::ref(data_available),
                boost::ref(timeout),boost::asio::placeholders::error(),
                boost::asio::placeholders::bytes_transferred()));
    //restart your timer
    data_available = true;
}