我正在尝试使用Boost ASIO进行串行端口异步读取,我必须在运行程序时连续收听该消息,此外,我还正在收听在Boost ASIO中找到的multicast udp reciever示例。我正在使用相同的io_context初始化UDP和串行接收器。当我尝试在控制台应用程序主程序中创建串行端口时,只能编译并读取串行端口一次。因此,我认为我应该将其放入类似example的单独类中,并可能使用单独的线程。但是,即使我使用与在主程序中运行的语法完全相同但只能运行一次的相同语法,也会出现编译错误。在连续(仍然异步)从udp端口数据读取数据的同时,如何继续以异步方式在串行端口上侦听。请指教。
我试图四处寻找非官方的例子,但是它们实在无济于事,要么贫穷,过时,要么只是不必要的复杂。我要构建的东西要简单得多
#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_;
};
这是我得到的错误:
1> c:\ users \ alam syed \ documents \ someproject \ boost \ include \ boost-root \ boost \ asio \ serial_port.hpp(746): 错误C2338:未满足ReadHandler类型要求1> c:\ users \ alam syed \ documents \ someproject \ public \ serialcomm.h(24):注意:请参阅 引用功能模板实例化'void boost :: 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&,size_t)1>] 1> c:\ users \ alam 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>”
答案 0 :(得分:0)
问题实际上很容易解决。我将其保留给像我这样的涉水者。只需使用此:
_serialport.async_read_some(boost::asio::buffer(recv_buffer_),
boost::bind(&SerialComm::handle_receive,
this, boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));