我们正在尝试从连接到Linux盒的2个USB鼠标中读取数据(此数据用于机器人上的里程表/本地化).因此,我们需要不断从每只鼠标读取其移动量.问题在于,当鼠标不动时,它不会发送任何数据,因此从中获取数据块的文件流将因此而执行,因此程序无法进行里程表计算(涉及速度的时间测量) .
有没有办法在输入流上设置超时(我们在C中使用ifstream并从/ dev / input / mouse中读取),因此我们能够知道鼠标何时不移动,而不必等待接收事件?还是我们需要弄乱线程(arggh …)?欢迎其他任何建议!
提前致谢!
解决方法:
从linux中读取多个文件描述符的一种常见方法是使用select().我建议从manpage开始.基本系统流程如下:
1)初始化设备
2)获取设备文件描述符列表
3)设置超时
4)以文件描述符和超时作为参数调用select-它将阻塞,直到其中一个文件描述符上有数据或达到超时为止
5)确定为什么要返回select并采取相应的措施(即,对具有数据的文件描述符调用read()).您可能需要在内部缓冲读取结果,直到获得整个数据报.
6)循环回到4.
这可以成为您的程序主循环.如果您已经有一个不同的主循环,则可以在不循环的情况下运行上述操作,但是您需要确保足够频繁地调用该函数,以免串行端口上的数据丢失.您还应该确保您的更新速率(即1 /超时)对于您的主要任务而言足够快.
Select可以对任何文件描述符(例如网络套接字)以及通过文件描述符公开接口的任何其他文件进行操作.