我们正在尝试从连接到linux盒子的2 usb鼠标中读取数据(这些数据用于机器人的测距/定位)。所以我们需要不断地从每只鼠标中读取它移动了多少。问题是当鼠标没有移动时,它不会发送任何数据,因此我们从中获取数据块的文件流,因此程序无法进行里程计算(其中涉及速度的时间测量)
有没有办法在输入流上设置超时(我们在C ++中使用ifstream并从/ dev / input / mouse读取),这样我们就能知道鼠标何时不移动,而不是等待接收事件?或者我们需要搞乱线程(arggh ......)?欢迎任何其他建议!
提前致谢!
答案 0 :(得分:5)
从linux中读取多个文件描述符的常用方法是使用select()。我建议从manpage开始。基本系统流程如下:
1)初始化设备
2)获取设备文件描述符列表
3)设置超时
4)使用文件描述符和超时作为参数调用select - 它将阻塞,直到其中一个文件描述符上有数据或达到超时为止
5)确定为什么select返回并相应地采取行动(即对具有数据的文件描述符调用read())。您可能需要在内部缓冲读取结果,直到获得整个数据克为止
6)循环回到4。
这可以成为你的程序主循环。如果您已经有一个不同的主循环,可以在不循环的情况下运行上面的循环,但是您需要确保该函数被足够频繁地调用,这样您就不会丢失串行端口上的数据。您还应该确保您的更新速率(即1 /超时)足够快,适合您的主要任务。
Select可以对任何文件描述符进行操作,例如网络套接字以及通过文件描述符公开接口的任何其他内容。
答案 1 :(得分:1)
您正在寻找的是从ifstream读取的异步方式,如套接字通信。唯一可以帮助的是readsome函数,如果没有数据可能会返回,但我怀疑这有帮助。
使用线程是解决此问题的最佳方法。
答案 2 :(得分:0)
看看boost Asio library。这可能有助于您处理schnaeder建议的线程。
答案 3 :(得分:-1)
不,没有这样的方法。您将不得不等待一个事件,或者创建一个自定义Timer类并等待超时重新生成或使用线程。