使用python3.5的NeXus-4的GetDeviceInfo

时间:2018-06-28 18:13:00

标签: python

我有一个正在工作的python 2.7程序,该程序调用DLL。我试图将脚本移植到python 3.5,但是没有成功。

这是一些示例代码:

from ctypes import ...

class NexusAdapter:
    def __init__(self, search_mode=0, serial=0, sample_rate=0):
        ...
        self._load_nexus_dll()

    def _load_nexus_dll(self):
        dll_path = 'GenericDeviceInterfaceDLL_x64'
        self._lib_nexus = WinDLL(dll_path)

    def init_generic_device(self):
        result = self._lib_nexus.InitGenericDevice(
            self._process_data, self._search_mode, self._serial)
        return result

    def get_device_info(self):
        device_info = DeviceInfo()
        self._lib_nexus.GetDeviceInfo(device_info)
        return device_info

class DeviceInfo(Structure):
    _fields_ = [("cName", c_char * 40),
                ("cSerialNumber", c_char * 40),
                ("cDescription", c_char * 40),
                ("cConnectionType", c_char * 40),
                ("dwTypeID", c_ulong),
                ("dwNumberOfChannels", c_ulong),
                ("bAuthenticated", c_bool)]


nexus_adapter = NexusAdapter(search_mode=0, serial=0, sample_rate=256)
init_res = nexus_adapter.init_generic_device()
device_info = nexus_adapter.get_device_info()
print(device_info.cName)  # On py2 device name (NeXus-4) is printed.
                          # On py3 b'' is printed

除get_device_info之外的所有方法均与py2和py3相同。使用py3方法get_device_info返回与初始化相同的结构(例如,如果我使用以下方式初始化DeviceInfo:device_info = DeviceInfo(b'test') 然后print(device_info.cName))将打印b'test'。

因此,我认为问题与DeviceInfo结构有关。

我发现python类型在py2和py3中对于ctypes是不同的。这也写在ctypes https://docs.python.org/2.7/library/ctypes.html#fundamental-data-types的文档中 https://docs.python.org/3.5/library/ctypes.html#fundamental-data-types,但C类型相同。

Differences in ctypes between Python 2 and 3上,我发现py2和py3中的字符串表示形式不同,但这意味着我将需要解码device_info.cName。 我没有找到解码结构的方法,但是我不确定这是否可以解决我的问题。

我认为检测设备有问题,但是如果我打开设备,init_res为0。根据{{​​3}},0表示“确定”。如果没有设备,则init_res将带有一些错误代码。

我不明白此代码还有什么其他问题。我是否错过了python代码中的某些内容?

编辑:

print(device_info.cSerialNumber)        # py3: b''   py2: Number
print(device_info.cDescription)         # py3: b''   py2: 'NeXus-4 Device'
print(device_info.cConnectionType)      # py3: b''   py2: 'Bluetooth'
print(device_info.dwTypeID)             # py3: 0     py2: Number
print(device_info.dwNumberOfChannels)   # py3: 0     py2: 6
print(device_info.bAuthenticated)       # py3: False py2: True

0 个答案:

没有答案