我正在尝试实现自己的同步串口“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协议的握手实现的一部分。通过异步制作并不需要更复杂(在过渡期间没有什么可以做的,但无论如何都要等待)。
我认为这个问题与重置每次读取时的串口或沿着这些线路的某些东西有关(我记得读过一篇关于从串口迭代读取时重置的正确时间的文章,但我找不到它再次不幸)。无论如何,我认为修复它并不是一件非常复杂的事情,但我很难找到答案。谢谢你的帮助。
答案 0 :(得分:0)
好的,因为我收到的一些建议,我发现在第一个循环中只读取了一个字节的数据,然后没有更多的数据被随后读取。这种行为虽然并不是没有根据的,因为boost正在做它应该做的事情。
“阻止[ing]直到成功读取一个或多个字节的数据”
答案并不是因为抛出了错误,而是因为我假设有数据正在传输,实际上没有数据通过网络传输(尽管如此,我仍然不完全清楚那里唯一的一个字节来自读取的第一次迭代)。我追溯了这个问题,发现了导致问题的硬件错误,所以,一旦修复了,数据正确传输,它就会停止阻塞。不敢相信我的想法,但感谢大家的建议。