2

我正在为我的博士学位编写一个程序来处理来自高速相机的数据。项目。该相机在 Linux 上带有一个 .so 文件形式的 SDK,用于与相机通信并获取图像。如前所述,它是一种高速摄像机,可提供大量数据(每分钟几 GB)。为了处理如此大量的数据,SDK 有一个非常方便的假脱机功能,它通过 DMA 以 FITS 文件的形式直接将数据假脱机到硬盘驱动器,这是一种在天文学中使用的带有标头的原始二进制格式。当我编写一个小型 C 程序,将 .so 文件链接进去并以这种方式调用假脱机函数时,这个函数可以正常工作。但是当我用 ctypes 包装 .so 文件并从 python 调用函数时,除了 spool 函数之外,所有函数都在工作。当我调用假脱机函数时,它不会返回任何错误,但是假脱机数据文件是乱码,该文件具有正确的格式,但所有帧的一半是 0。在我的世界里,.so 文件中的函数应该根据调用它的程序、我自己的小 C 程序或 python(毕竟只是一个更大的 C 程序)而表现不同是没有意义的。当从不同的程序调用 .so 时,有没有人知道有什么不同?

我会非常感谢任何建议

尽管相机是商用的,但有些驱动程序是 GPL 并且可用,尽管有点复杂。(不幸的是,它似乎不是假脱机功能)我在 python 中有一个用于 Handel 相机的对象。

课程的开头写道:

class Andor:
  def __init__(self,handle=100):
    #cdll.LoadLibrary("/usr/local/lib/libandor.so")
    self.dll = CDLL("/usr/local/lib/libandor.so")
error = self.dll.SetCurrentCamera(c_long(handle))
    error = self.dll.Initialize("/usr/local/etc/andor/")

    cw = c_int()
    ch = c_int()
    self.dll.GetDetector(byref(cw), byref(ch))

相关功能如下:

def SetSpool(self, active, method, path, framebuffersize):
    error = self.dll.SetSpool(active, method, c_char_p(path), framebuffersize)
    self.verbose(ERROR_CODE[error], sys._getframe().f_code.co_name)
    return ERROR_CODE[error]

在相应的标题中,它显示:

unsigned int SetSingleTrackHBin(int bin);

unsigned int SetSpool(int active, int method, char * path, int framebuffersize);

unsigned int SetStorageMode(at_32 mode);

unsigned int SetTemperature(int temperature);

让相机运行的代码如下所示:

cam = andor.Andor()
cam.SetReadMode(4)
cam.SetFrameTransferMode(1)
cam.SetShutter(0,1,0,0)
cam.SetSpool(1,5,'/tmp/test.fits',10);
cam.GetStatus()
if cam.status == 'DRV_IDLE':
acquireEvent.clear()
cam.SetAcquisitionMode(3)
cam.SetExposureTime(0.0)
cam.SetNumberKinetics(exposureNumber)
cam.StartAcquisition()
4

1 回答 1

0

我的猜测是,它不是对假脱机函数本身的调用,而是一个调用序列,它导致向库提供/从库中提供损坏的值。

你在 64 位平台上吗?不指定restype返回 64 位整数(long使用 gcc)或指针的任何内容将导致这些值被静默截断为 32 位。此外,ctypes.c_voidp处理有点令人惊讶——restype的值ctypes.c_voidp不会被截断,而是在 Python 解释器中以 type 的形式返回,int如果高指针作为参数反馈给其他函数而不进行强制转换,则会产生可预见的搞笑结果。

我还没有测试过,但是对于大于 sys.maxint 的值,这两种情况也可能会影响 32 位平台。

100% 确定您正在传递和接收您期望的值的唯一方法是为您调用的所有函数指定argtypesand restype。这包括为所有这些函数操作的s 创建Structure类和关联的 s,甚至是 opaque s。POINTERstructstruct

于 2010-09-02T18:38:59.600 回答