Python调用传感器DLL中的SDK函数,该函数接受指针IP和端口并返回void*(void*配置文件传感器的句柄)

2024-09-30 03:23:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚接触Python。我正试图通过它的DLL库连接到一个激光传感器。这个库中的SDK函数是用C++语言编译的。你知道吗

通过在python中使用ctypes,我的第一个尝试是调用EthernetScanner\u Connect函数。功能参数如下:

void* EthernetScanner_Connect(char *chIP, char *chPort, int iTimeOut)

根据c++中的函数描述,如果连接失败,它应该返回空指针,否则它应该将句柄返回给profile sensor,这将在其他函数中使用。你知道吗

我的python代码到现在为止:

from ctypes import *

lib=windll.LoadLibrary("c:\\EthernetScanner.dll")

if lib:
    print("the Library is loaded")

EthernetScanner_Connect = getattr(lib,"EthernetScanner_Connect")

EthernetScanner_Connect.restype = c_void_p
EthernetScanner_Connect.argtypes =[c_char_p,c_char_p,c_int]
x = EthernetScanner_Connect(b"193.164.200.1\0",b"32407\0",0)

print(x)

因为我还没有连接到传感器,所以我希望该函数为空,但它给出了以下信息:

the Library is loaded
45940800

Tags: the函数islibconnectlibrary传感器ctypes
1条回答
网友
1楼 · 发布于 2024-09-30 03:23:08

我想先指出[Python 3.Docs]: ctypes - A foreign function library for Python。你知道吗

我将根据一些假设发布一个答案:

  1. 您所说的传感器与[FoxControls]: acuity-ap820-users-manual.pdf中描述的相同。如果这不是真的,答案是无用的
  2. 根据上面的文档,EthernetScanner\u GetConnectStatus可能的返回状态是(emphasis是我的):

    Status is a unsigned integer used as a buffer to contain the status code when the function returns.
    The status codes are:

    • 0: Disconnected
    • 1: Disconnecting
    • 2: Connecting
    • 3: Connected


    基于上述情况,以及连接超时为0的事实,我假设(文档中没有任何内容支持它)它尝试以非阻塞模式连接:

    • EthernetScanner\u Connect立即返回(意味着在尝试连接之前-如果您愿意,它“调度”连接操作)一个指针。对于非阻塞异步IO示例,请选中[MS.Docs]: connect function
    • 应该使用EthernetScanner\u GetConnectStatus定期查询(上述)指针。这就是为什么指针非NULL是有意义的(当EthernetScanner\u Connect返回时,连接尝试结果还不知道)

下面是一段应该用来处理这个问题的代码(不用说这是盲编码,意思是我实际上没有测试它)。
根据2nd假设,如果传递的超时大于0EthernetScanner\u Connect应返回NULL。你知道吗

代码.py

#!/usr/bin/env python3

import sys
import ctypes
import time


DLL_NAME = "c:\\EthernetScanner.dll"

CONNECT_STATUS_DISCONNECTED = 0
CONNECT_STATUS_DISCONNECTING = 1
CONNECT_STATUS_CONNECTING = 2
CONNECT_STATUS_CONNECTED = 3

CONNECT_STATUSES_PENDING = [
    CONNECT_STATUS_CONNECTING,
    CONNECT_STATUS_DISCONNECTING,
]

def main():

    connect_timeout_msec = 0
    nb_mode = connect_timeout_msec == 0

    dll = ctypes.WinDLL(DLL_NAME)

    EthernetScanner_Connect = dll.EthernetScanner_Connect
    EthernetScanner_Connect.argtypes = [ctypes.c_char_p, ctypes.c_char_p, ctypes.c_uint32]
    EthernetScanner_Connect.restype = ctypes.c_void_p

    EthernetScanner_GetConnectStatus = dll.EthernetScanner_GetConnectStatus
    EthernetScanner_GetConnectStatus.argtypes = [ctypes.c_void_p, ctypes.POINTER(ctypes.c_uint32)]

    EthernetScanner_Disconnect = dll.EthernetScanner_Disconnect
    EthernetScanner_Disconnect.argtypes = [ctypes.c_void_p]
    EthernetScanner_Disconnect.restype = ctypes.c_uint32

    ptr = EthernetScanner_Connect(b"192.168.100.1", b"32001", connect_timeout_msec)
    if nb_mode:
        print("Non blocking mode: EthernetScanner_Connect returned {:}".format(ptr))
        poll_timeout_sec = 0.5
        connect_status = ctypes.c_int(CONNECT_STATUS_CONNECTING)
        while connect_status.value in CONNECT_STATUSES_PENDING:
            time.sleep(poll_timeout_sec)
            EthernetScanner_GetConnectStatus(ptr, ctypes.byref(connect_status))
        if connect_status.value != CONNECT_STATUS_CONNECTED:
            print("Couldn't connect (status: {:})!".format(connect_status.value))
            return
    else:
        print("Blocking mode: EthernetScanner_Connect returned {:}".format(ptr))
        if not ptr:
            print("Couldn't connect!")
            return

    # Do something with the sensor (pointer)

    EthernetScanner_Disconnect(ptr)


if __name__ == "__main__":
    print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
    main()
    print("Done.")

相关问题 更多 >

    热门问题