我对构建库感到迷茫,我不得不纠结在一起。我需要帮助将一些计时器引入此构造中。
我有以下几点:
com.cpp具有main
并包含com.hpp
com.hpp包含host.h和所需的boost并定义了comClient类
包含host.h的host.c
wrapper.cpp包含com.hpp和一些需要的增强功能包括
现在,我的com.cpp正在创建comClient并将其用于com端口上的异步通信。使用boost::asio::serial_port
和boost::asio::io_service
。
我需要使用一些计时器,以捕获何时需要发送太长的小包。
创建comClient实例时,应该初始化paket-timer。
在comClient的私有函数中使用asynch_read_some
,我调用comClient的私有处理程序,然后该处理程序调用host.c函数,该函数调用wrapper.cpp函数以重新启动计时器。
这是初始化计时器的功能:
//wrapper.cpp
void IniPacketTimer(void *pCHandle){
boost::asio::io_service io;
boost::asio::deadline_timer t(io, boost::posix_time::milliseconds(25));
t.async_wait(&hostOnTimeout(pCHandle));
io.run();
}
简而言之,这就是命令链:
//comClient.cpp
main{
comClient cc();
}
//comClient.hpp
class comClient(boost::asio::io_service& io_service){
comClient(){
hostInit();
aread();
}
private:
aread( call aread_done)
areaddone(call hostNewData())
}
//host.c
hostInit(){
IniPacketTimer()
}
hostNewData(){
resetTimer
}
//wrapper.cpp
resetTimer(){
t.expires_from_now
}
问题:
我如何提供一个异步计时器,该计时器不影响串行端口上的异步读取/写入操作,但在达到截止日期时触发函数执行?
我应该使用已经存在的
io_service
还是可以(如果我刚刚创建另一个)?为什么我得到错误C2102'&'期望行
t.async_wait
的L值? 最佳答案
您的问题尚不清楚,并且由于您没有发布实际代码,因此很难猜测出您的问题是什么。
特别是您的线程不清楚,但对于asio非常重要。
下面是将编译但无法运行的示例。希望它给您提示如何进行。
它将打开一个串行端口和一个计时器。每当计时器到期时,它将启动一个新计时器。它是我前一段时间使用的代码的简化版本,因此也许会对您有所帮助。
#include <boost/asio.hpp>
#include <boost/asio/serial_port.hpp>
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <vector>
class SerialCommunication
{
public:
SerialCommunication(boost::asio::io_service& io_service, const std::string& serialPort)
: m_io_service(io_service)
, m_serialPort(m_io_service)
, m_timeoutTimer(m_io_service, boost::posix_time::milliseconds(5))
{
configureSerialPort(serialPort);
}
void configureSerialPort(const std::string& serialPort)
{
if(m_serialPort.is_open())
{
m_serialPort.close();
m_timeoutTimer.cancel();
}
boost::system::error_code ec;
m_serialPort.open(serialPort, ec);
if(m_serialPort.is_open())
{
// start Timer
m_timeoutTimer.async_wait(boost::bind(&SerialCommunication::TimerExpired, this, _1));
header_sync();
}
}
void header_sync()
{
m_serialPort.async_read_some(boost::asio::buffer(&m_header.back(), 1),
boost::bind(&SerialCommunication::header_sync_complete, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
void header_sync_complete(
const boost::system::error_code& error, size_t bytes_transferred)
{
// stripped
read_payload(&m_payload[0], 0);
}
void read_payload(uint8_t* buffer, uint8_t length)
{
m_serialPort.async_read_some(boost::asio::buffer(buffer, length),
boost::bind(&SerialCommunication::payload_read_complete, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
void payload_read_complete(
const boost::system::error_code& error, size_t bytes_transferred)
{
// stripped
// timer cancel and reset
m_timeoutTimer.cancel();
m_timeoutTimer.expires_at(boost::posix_time::microsec_clock::local_time() +
boost::posix_time::milliseconds(5));
m_timeoutTimer.async_wait(boost::bind(&SerialCommunication::TimerExpired, this, _1));
memset(&m_header[0], 0, 3);
header_sync();
}
void TimerExpired(const boost::system::error_code& e)
{
m_timeoutTimer.expires_at(m_timeoutTimer.expires_at() + boost::posix_time::milliseconds(5));
m_timeoutTimer.async_wait(boost::bind(&SerialCommunication::TimerExpired, this, _1));
}
boost::asio::io_service& m_io_service;
boost::asio::deadline_timer m_timeoutTimer;
boost::asio::serial_port m_serialPort;
std::vector<uint8_t> m_header;
std::vector<uint8_t> m_payload;
};
int main()
{
boost::asio::io_service io_service;
SerialCommunication cc(io_service, "/dev/ttyS0");
io_service.run();
return 0;
}
关于c++ - 如何在此环境中设置duration_timer?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13071037/