5

我们正在尝试从连接到 linux 盒子的 2 个 USB 鼠标中读取数据(该数据用于机器人的里程计/定位)。所以我们需要不断地从每只鼠标中读取它移动了多少。问题是当鼠标不移动时,它不会发送任何数据,因此我们从中获取数据的文件流会阻止执行,因此程序无法进行里程计计算(其中涉及速度的时间测量) .

有没有办法在输入流上设置超时(我们在 C++ 中使用 ifstream 并从 /dev/input/mouse 读取),以便我们能够知道鼠标何时不移动,而不是等待接收事件?还是我们需要弄乱线程(arggh ...)?欢迎任何其他建议!

提前致谢!

4

4 回答 4

7

在 linux 中读取多个文件描述符的常用方法是使用 select()。我建议从手册页开始。基本系统流程如下:

1) 初始化设备
2) 获取设备文件描述符列表
3) 设置超时
4) 使用文件描述符和超时作为参数调用 select - 它将阻塞直到其中一个文件描述符上有数据或达到超时
5 ) 确定选择返回的原因并采取相应措施(即在具有数据的文件描述符上调用 read())。您可能需要在内部缓冲读取的结果,直到获得整个数据报。
6)循环回到4。

这可以成为您的程序主循环。如果您已经有一个不同的主循环,则可以在不循环的情况下运行上述循环,但您需要确保该函数被足够频繁地调用,这样您就不会丢失串行端口上的数据。您还应该确保您的更新速率(即 1/超时)对于您的主要任务来说足够快。

Select 可以对任何文件描述符进行操作,例如网络套接字以及通过文件描述符公开接口的任何其他内容。

于 2009-02-22T16:31:59.017 回答
1

您正在寻找的是一种从 ifstream 中读取的异步方式,例如套接字通信。唯一可以帮助的是readsome函数,如果没有可用数据,它可能会返回,但我怀疑这是否有帮助。

使用线程将是处理此问题的最佳方法。

于 2009-02-22T15:36:31.847 回答
0

看看boost Asio 库。这可能会帮助您处理 schnaeder 建议的线程。

于 2009-02-22T16:33:21.617 回答
-1

不,没有这样的方法。您将不得不等待一个事件,或者创建一个自定义 Timer 类并等待超时重新轮询,或者使用线程。

于 2009-02-22T15:34:22.493 回答