boost asio - 检查是否有任何东西要从串口读取

时间:2013-01-25 08:54:26

标签: c++ boost serial-port boost-asio

我使用boost :: asio库来控制带串行连接的电机。问题是boost :: asio :: serial_port :: read()函数会让程序冻结,如果设备没有发送任何东西供我阅读。

如何检查设备是否有东西通过端口告诉我?

如果我向设备发送命令,我可以回答没问题。但有没有办法知道它是否在没有我发送命令的情况下发送了什么?或者这在串行连接中没有任何意义,其中命令仅作为对发送命令的响应而被接收?

请检查我的代码

try
{
    port = new boost::asio::serial_port(io_serial, comPort.c_str());
}
char rcvd;
std::string res;
while(1)
{
    boost::asio::read(*port,boost::asio::buffer(&rcvd, 1)); //here it freezes till something is read
    std::cout<<rcvd<<std::endl; //I know it froze in the last line because nothing was written from here
    if(rcvd == '\r' || rcvd == '\0')
    {
        break;
    }
    res.push_back(rcvd);
}
return res;

感谢您的任何努力。

1 个答案:

答案 0 :(得分:2)

对于串行端口,Boost.Asio既不提供非阻塞同步读取也不提供超时读取。因此,替代选项是使用异步读取。 Boost.Asio提供了this示例。虽然这个例子是针对TCP的,但它应该举例说明异步读取超时的整体概念和方法。

此外,根据发布的逻辑,读取数据直到回车或NULL,可能值得考虑使用line-based operation,例如boost::asio::async_read_until