2011-10-02 68 views
5

我有一个红外摄像机/跟踪器,我正在通过串口进行通信。我正在使用pyserial模块来做到这一点。相机以60 Hz的速率更新被跟踪物体的位置。为了获得跟踪对象的位置,我执行一个pyserial.write(),然后用pyserial.read(serialObj.inWaiting())监听一个传入的回复。一旦接收到回复/位置,重新进入while循环等等。我的问题与这种方法的可靠性和速度有关。我需要计算机以至少60Hz的速率获得位置(然后位置将通过UDP发送到实时操作系统)。这是Pyserial/Python的能力吗?或者我应该考虑其他基于C的方法吗?pyserial/python和实时数据采集

感谢, 卢克

+1

这是怎么产生的?你能用Python获得什么样的采样率?我已经做了一些简单的数据采集,通过RS232的奥豪斯规模,但只能得到5hz(可能是规模) – Chris

回答

0

Python 应该保持良好状态,但最好的办法是确保您监控您每秒读取多少条读取数据。计算每秒完成读取的次数,如果此数字太低,请写入性能日志或类似内容。您应该考虑将python程序的其余部分(如果有的话)的I/O部分从pyserial读取调用阻塞中解耦出来。

+1

谢谢大家的所有答案。我想我会在考虑转移到别的东西之前测试读/写pyserial函数的性能。但是你能解释一下阻塞的串口调用以及为什么它们可能需要解耦其余的程序(你是对的,读/写只是所需功能的一小部分)。 – dataman

+0

Pyserial将默认阻止读取调用(您可以配置它,所以它不会这样做)。这意味着当你调用'read'时,整个程序都会等待写入内容,然后读取它,然后你的程序就可以继续。有几种解决方法,无论是使用非阻塞调用('read'立即返回,但可能什么都不用),事件驱动框架如扭曲(扭曲知道你在等待,并在此期间做其他事情),或通过使用进程/线程(尽管您在收听进程中的传入消息时遇到同样的问题)。 – jozzas

+1

是的,我已经设置了超时= 0,然后最终得到一次一个字符。也就是说,我在while循环中执行serial.read(1),并检查表示返回命令结束的'\ r',并且在满足条件时,我发出一个新的get位置请求。从一些简单的实验来看,似乎我没有错过相机系统中的任何相框,这很棒,虽然我想以某种方式确保这种情况总是如此。就像我在程序执行时打开浏览器一样,是否有强制脚本具有最高优先级的方法? – dataman

1

这是潜伏期比速度更加的问题。

Python总是执行内存分配和释放,但是如果数据被重用,C库会重用相同的内存。因此,操作系统(C库/ UDP/IP协议栈)比Python本身具有更多的影响力。

我真的认为你应该在你的RTOS机器上使用串口,​​并使用C代码和预先分配的缓冲区。

0

我会怀疑Python会跟上数据就好了。我的建议是尝试一下,如果Python中显得滞后,然后尝试PyPy代替 - 的Python的实现,编译大部分的内循环到机器代码的速度接近,这样C.

http://pypy.org/