我正在Linux下用c++编写一个由UART(Boost::asio串行)驱动的OpenGL软件。
我目前完成了接收和处理数据,并准备用OpenGL将其可视化。这个问题可能不限于OpenGL,无论如何我的问题是:
我如何从UART回调函数调用OpenGL绘图函数?
当然,我应该能让它运行起来:
- 使用任何IPC(PIPE, socket,信号量)方法
- 将OpenGL绘图函数或其类作为变量传递给UART回调
- 将所有内容放在一个类中
我遇到过很多类似的案例,并且用不同的方式实现。但是我仍然想不出正确的答案是什么。
我个人不喜欢管道或文件IO ipc,唯一剩下的选项是套接字,信号量和共享内存,我一直在使用。
我如何从UART回调函数调用OpenGL绘图函数?
。
只能从绘制处理程序中绘制。串行I/O应该像对待其他输入一样对待:在事件循环或空闲处理程序中处理它,使用接收到的数据更新代表新状态的变量并发出重绘。
这不是一个tty,而是一个Linux evdev,但总的想法是一样的:这是一个小的演示程序,展示了如何从3D连接空间导航器读取输入,并将其处理成一个3D场景渲染它与OpenGL: http://homepages.physik.uni-muenchen.de/~Wolfgang.Draxinger/stuff/spaceball.tar.bz2
当然,这取决于应用程序。
使用串行通信回调函数访问OpenGL状态确实很有意义,但如果你正在做原型/概念验证,为什么要让你的工作变得更难呢?
共享内存是一个很好的选择;回调可以把数据放在某个地方,触发绘图线程并等待它完成。(这离调用绘图函数本身的回调只有一步之遥。)
虽然我可能更喜欢消息传递。当接收到数据时,回调可以打包并将其发送(复制)给绘图线程,后者可以在接收到数据后进行绘制。这将有一个额外的好处,即UART代码不需要等待绘图代码,尽管考虑到OpenGL的速度,特别是与串行通信相比,这不太可能是一个问题。