pyserial/python与实时数据采集

pyserial/python与实时数据采集,python,real-time,pyserial,Python,Real Time,Pyserial,我有一个红外摄像机/跟踪器,通过串口与之通信。目前我正在使用pyserial模块来完成这项工作。摄像机以60 Hz的频率更新跟踪对象的位置。为了获得被跟踪对象的位置,我执行一个pyserial.write(),然后用pyserial.read(serialObj.inWaiting())侦听传入的应答。一旦收到回复/位置,while循环将重新进入,依此类推。我的问题与这种方法的可靠性和速度有关。我需要计算机以至少60Hz的频率获取位置(然后通过UDP将位置发送到实时操作系统)。这是Pyseria

我有一个红外摄像机/跟踪器,通过串口与之通信。目前我正在使用pyserial模块来完成这项工作。摄像机以60 Hz的频率更新跟踪对象的位置。为了获得被跟踪对象的位置,我执行一个pyserial.write(),然后用pyserial.read(serialObj.inWaiting())侦听传入的应答。一旦收到回复/位置,while循环将重新进入,依此类推。我的问题与这种方法的可靠性和速度有关。我需要计算机以至少60Hz的频率获取位置(然后通过UDP将位置发送到实时操作系统)。这是Pyserial/Python能够做到的,还是我应该研究其他基于C的方法

谢谢,
卢克

这与其说是速度问题,不如说是延迟问题

Python总是执行内存分配和释放,但是如果数据被重用,C库将重用相同的内存。 因此,OS(C库/UDP/IP堆栈)将比Python本身产生更大的影响


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

我怀疑Python会很好地跟上数据。我的建议是尝试一下,如果Python看起来比较滞后,那么就试试PyPy——PyPy是Python的一种实现,它将大部分内部循环编译成机器代码,以达到接近C的速度


Python应该保持良好状态,但最好的办法是确保监视每秒的读取次数。计算每秒完成读取的次数,如果此数字过低,请写入性能日志或类似日志。还应该考虑将I/O部分与Python程序的其余部分解耦(如果有一个),因为pyStRead调用是阻塞的。

谢谢所有人的答案。我想在我考虑到别的事情之前,我将测试读/写PyStin函数的性能。但是,您能否解释一下被阻止的串行调用,以及为什么它们可能需要解耦程序的其余部分(您是对的,读/写只是所需功能的一小部分)。Pyserial默认情况下会阻止读调用(您可以配置它,这样它就不会执行此操作)。这意味着当您调用
read
时,整个程序都会坐在那里等待写入内容,然后读取,然后您的程序就可以继续了。有两种方法可以解决这个问题,一种是使用非阻塞调用(
read
立即返回,但可能没有返回),另一种是像twisted这样的事件驱动框架(twisted知道您在等待,同时做其他事情),或者使用进程/线程(虽然您在侦听来自进程的传入消息时也遇到同样的问题)。是的,我已将超时设置为0,然后一次只能获取一个字符。也就是说,我执行serial.read(1)在一段时间内,循环并检查“\r”,它指示返回命令的结束,当满足该条件时,我会发出一个新的get position请求。从一些简单的实验来看,我似乎没有错过相机系统中的任何帧,这很好,尽管我想以某种方式确保始终如此。就像我在程序执行时打开浏览器,是否有办法强制脚本具有最高优先级?这会起作用,但效率不高-您可能每秒读取数千次,并且由于一次只能读取一个字符,您可能无法跟上到达的数据。我会使用twisted并安排一个循环调用以每秒60次的速度从管道中读取所有等待的数据。这将大大减少您的开销。结果如何?使用python可以获得什么样的采样率?我通过RS232从ohaus刻度上进行了一些简单的数据采集,但只能获得5hz(可能是刻度)