gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:48:22 25 4
gpt4 key购买 nike

我刚接触 Python。我正在尝试通过其 DLL 库连接到激光传感器。本库中的SDK函数是用C++语言编译的。

通过在 python 中使用 ctypes,我的第一个尝试是调用 EthernetScanner_Connect 函数。函数参数如下:

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

根据c++中的函数描述,如果连接失败应该返回NULL指针,否则应该返回轮廓传感器的句柄,该句柄将在其他函数中使用。

到目前为止我在 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)

由于我还没有连接到传感器,所以我期望此函数为 NULL,但它给了我以下信息:

the Library is loaded
45940800

最佳答案

我想先指出 [Python 3.Docs]: ctypes - A foreign function library for Python .

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

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

    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 的事实,我假设(doc 中没有任何内容支持它,不过)它会尝试连接在非阻塞模式下:

    • EthernetScanner_Connect 返回立即(意味着尝试连接之前 - 如果您愿意,它会“安排”连接操作)NULL 指针。对于非阻塞(异步)IO 示例,检查[MS.Docs]: connect function
    • 应使用 EthernetScanner_GetConnectStatus(定期)查询(上述)指针。这就是为什么指针为非 NULL 是有意义的(因为当 EthernetScanner_Connect 返回时,连接尝试结果尚不可知)

这里有一段代码应该可以解决这个问题(不用说它是盲编码 - 这意味着我实际上并没有测试它)。
作为第二个nd假设的结果,如果传递超时大于 0EthernetScanner_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.")

关于Python 在传感器的 DLL 中调用 SDK 函数,该函数采用指针 IP 和端口并返回 void*(void* 配置文件传感器的句柄。),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55863680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com