增强 ASIO 和串行端口异步读取



我正在尝试使用Boost ASIO进行串行端口异步读取,当我的程序运行时,我必须不断侦听该读取,此外,我还在收听我在Boost ASIO中找到的组播udp接收器示例。UDP 和串行接收器我都使用相同的io_context初始化。当我尝试在控制台应用程序主程序中创建串行端口时,我可以编译和读取串行端口,但只能读取一次。所以我想我应该把它变成一个单独的类,就像在这个例子中一样,也许可以使用一个单独的线程。但是,即使我使用与我在主程序中尝试的完全相同的语法,我也会出现编译错误,该语法运行良好,但只有一次。当我连续(仍然异步(从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:不满足读取处理程序类型要求 1>c:\users\alam syed\documents\someproject\public\serialcomm.h(24(: 注意:参见 对函数模板实例化 'void 的引用 boost::asio::serial_port::async_read_some(const MutableBufferSequence &,ReadHandler &&(' 正在编译 1>with 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:\用户\ALAM syed\documents\someproject\boost\include\boost-root\boost\asio\use_future.hpp(146(: 注意:请参阅对类模板实例化的引用 正在编译的"boost::asio::use_future_t>">

这个问题实际上很容易解决。我把它留给像我这样的一些喋喋不休的人。只需使用这个:

_serialport.async_read_some(boost::asio::buffer(recv_buffer_),
boost::bind(&SerialComm::handle_receive,
this, boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));

最新更新