[英]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.