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