You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python ctypes调用SimpleMotionV2的smOpenBus函数返回-1求助

问题:Python ctypes调用SimpleMotionV2的smOpenBus始终返回-1

调用Python的ctypes库调用SimpleMotionV2的smOpenBus函数时,传入有效COM端口(如COM5、COM24)始终返回-1。已确认DLL函数导出正常,尝试过c_wchar_p、c_char_p传参,添加/不添加NULL终止符均无效。

相关代码

C语言实现的smOpenBus函数

smbus smOpenBus( const char * devicename )
{
    int handle;

    //true on first call
    if(smInitialized==smfalse)
        smBusesInit();

    //find free handle
    for(handle=0;handle<SM_MAX_BUSES;handle++)
    {
        if(smBus[handle].opened==smfalse) break;//choose this
    }
    //all handles in use
    if(handle>=SM_MAX_BUSES) return -1;

    //open bus device
    smBus[handle].bdHandle=smBDOpen(devicename);
    if(smBus[handle].bdHandle==-1) return -1;

    //success
    strncpy( smBus[handle].busDeviceName, devicename, SM_BUSDEVICENAME_LEN );
    smBus[handle].busDeviceName[SM_BUSDEVICENAME_LEN-1]=0;//null terminate string
    smBus[handle].opened=smtrue;
    return handle;
}

我的Python代码

import ctypes as ct

dll = ct.CDLL(r'./SMv2_x64.dll')

dll.smOpenBus.argtypes = ct.c_char_p,
dll.smOpenBus.restype = ct.c_long

ret_val = dll.smOpenBus(b'COM24')
print(ret_val)

问题排查与解决方案

从C代码逻辑看,smOpenBus返回-1有两种可能:

  1. 所有SM_MAX_BUSES个总线句柄被占用(首次调用可排除此情况)
  2. 底层的smBDOpen(devicename)调用失败(核心原因)

针对smBDOpen失败,可按以下步骤排查:

  • 检查COM端口访问权限:Windows系统中,串口可能被其他程序占用,或需要管理员权限才能打开。尝试以管理员身份运行Python脚本。
  • 修正COM端口命名格式:当COM端口号大于9时,Windows要求使用扩展路径格式\\.\COMxx。修改Python调用参数为:
    ret_val = dll.smOpenBus(b'\\\\.\\COM24')
    
  • 确认DLL与Python位数匹配:你使用的是64位DLL(SMv2_x64.dll),必须搭配64位Python运行。若Python是32位,需更换为32位版本的SimpleMotionV2 DLL。
  • 验证串口驱动与依赖组件:确保目标COM端口的驱动已正确安装,SimpleMotionV2库所需的运行时组件(如VC++运行库)已齐全。
  • 增加错误诊断:调用SimpleMotionV2的smGetLastError函数获取具体错误码,精准定位问题:
    # 添加错误查询逻辑
    dll.smGetLastError.restype = ct.c_int
    ret_val = dll.smOpenBus(b'\\\\.\\COM24')
    print(f"返回值: {ret_val},最后错误码: {dll.smGetLastError()}")
    

内容的提问来源于stack exchange,提问作者Adam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 18:50:41