首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Boost ASIO和串口异步读取

Boost ASIO和串口异步读取
EN

Stack Overflow用户
提问于 2018-09-21 17:43:20
回答 1查看 2.9K关注 0票数 1

我正在尝试使用Boost ASIO进行串行端口异步读取,在运行我的程序时我必须不断地听,此外,我还在听Boost ASIO中的多播udp接收示例。UDP和串行接收器我都在用相同的io_context初始化。当我尝试在我的控制台应用程序主程序中创建串口时,我可以从串口编译和读取,但只能读一次。所以我想我应该把它变成一个单独的类,就像在这个示例中一样,并且可能使用一个单独的线程。但是,即使我使用的语法与我在主程序中使用的语法相同,也会出现编译错误,该程序运行良好,但只运行了一次。在连续(仍然是异步)从udp端口数据读取时,我如何在串口上继续以异步方式侦听。请指点。

我试着四处寻找非官方的例子,但它们确实没有帮助,要么是贫穷的,过时的,要么只是不必要的复杂。我想要建立的东西要简单得多,像这样

代码语言:javascript
运行
复制
#pragma once
#include <boost/asio.hpp>
#include <boost/array.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <iostream>

class SerialComm
{
public:
    SerialComm(boost::asio::io_context& io_context, std::string& serial_port_name) :_serialport(io_context, serial_port_name)
    {
        start_receive();
    }

    ~SerialComm()
    {
    }

private:
    void start_receive()
    {
        _serialport.async_read_some(boost::asio::buffer(my_buffer, 1024),
            &SerialComm::handle_receive);
    }

    void handle_receive(const boost::system::error_code& error,
        std::size_t bytes_transferred)
    {
        if (!error)
        {
            std::cout << "Recieved:" << my_buffer << std::endl;
        }
    }

private:

    boost::asio::serial_port _serialport;
    unsigned char my_buffer[1024];
    //boost::asio::buffer<char, 1024> recv_buffer_;
};

这是我得到的错误:

syed\documents\someproject\boost\include\boost-root\boost\asio\serial_port.hpp(746):error C2338:未满足ReadHandler类型要求注意:参见参考函数模板实例化‘voidboost::asio::serial_port::async_read_some(const MutableBufferSequence &,ReadHandler &&’正在用1> 1>编译1> MutableBufferSequence=boost::asio::mutable_buffers_1,1> ReadHandler=void (__cdecl SerialComm::* )(const boost::system::error_code &syed\documents\someproject\boost\include\boost-root\boost\asio\use_future.hpp(138):注释:参见对正在编译的类模板实例化'boost::asio::use_future_t>::std_allocator_void‘的引用1>c:\users\alam syed\documents\someproject\boost\include\boost-root\boost\asio\use_future.hpp(146):备注:参见对类模板实例化的引用正在编译的“boost::asio::use_future_t>”

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-21 18:04:01

这个问题实际上很容易解决。我把它留给像我这样的傻瓜。就用这个吧:

代码语言:javascript
运行
复制
_serialport.async_read_some(boost::asio::buffer(recv_buffer_),
            boost::bind(&SerialComm::handle_receive,
                this, boost::asio::placeholders::error,
                boost::asio::placeholders::bytes_transferred));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52448710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档