繁体   English   中英

C ++ Boost Asio串行端口同步read_some是否无限期阻塞?

[英]C++ Boost Asio Serial Port Synchronous read_some Blocking Indefinitely?

我正在尝试实现自己的同步串行端口“ read_until”功能,但是超时。 我的实现在伪代码中看起来像这样:

//returns true if timed out, otherwise false

bool MyReadUntil(string delim, int timeoutSecs)
{
    //set up timer
    time start = now();
    time current = now();
    time deltaTime = start - current;

    //keep appending to this string until timer runs out
    string readString = "";
    char[1024] cBuff;
    boost::system::error_code ec;

    while(readString.find(delim) == string::npos)
    {
        //update time and return true if timed out
        current = now();
        deltaTime = start-current;
        if (deltaTime>=timeoutSecs)
        {
            return true;
        }
        else
        {
            //this only works once
            //NOTE: serialPort is a pointer to a boost::asio::serial_port
            serialPort->read_some(boost::asio::buffer(cBuff), ec);
            if (!ec)
            {
                readString = readString + cBuff;
            }
        }

    }
    //if we break the while loop no timeout
    return false;

}

因此,发生的情况是read_some函数在循环的第一次迭代中仅读取一次,然后在下次调用时永远读取一次。 我尝试查找答案并进行了一段时间的搜索,但是不幸的是,术语“ read_some”和“ async_read_some”非常相关,并且由于异步功能的使用更为普遍,后者在我的搜索查询中占主导地位,到目前为止,很难找到答案。

我想避免为此输入async_read,因为这只是usb协议握手实现的一部分。 不必通过使其变得异步而变得更加复杂(在此期间,它什么也不需要做,但是仍然要等待)。

我认为这个问题与每次读取时重置串行端口有关,或者与之类似(我记得读过一篇文章,内容涉及从串行端口迭代读取时的正确重置时间,但不幸的是我找不到它了)。 无论如何,我认为修复起来并不复杂,但是我很难找到答案。 提前感谢您的帮助。

好的,因此由于我收到的一些建议,我发现在第一个循环中仅读取了一个字节的数据,随后不再读取任何数据。 但是,这种行为并非没有根据,因为boost确实在执行应有的操作。 这是

“阻塞直到成功读取一个或多个字节的数据”

答案不是抛出错误,而是因为我认为实际上是在传输数据,而实际上没有数据在传输(尽管,我仍然不清楚一个单独的字节在哪里从读取的第一个迭代开始)。 我追溯了此问题,并发现了导致该问题的硬件错误,因此,一旦解决该问题,并正确传输数据,它就会停止阻塞。 不敢相信,这让我无所适从,但感谢大家的建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM