我是在Matlab中使用dll文件的新手,并且在返回errorNumber时遇到了一些麻烦。 dll的文档特定于C,并建议使用以下内容来实现我想要的功能:

#include “PiUsb.h”

void * pUsb1;
int ErrorNumber;
int MotorSerialNumber = 10; // Serial number from Motor

pUsb1 = piConnectMotor(&ErrorNumber,MotorSerialNum);
if (ErrorNumber == PI_DEVICE_NOT_FOUND)
AfxMessageBox( "Unable to find Motor..." );
else
AfxMessageBox( "Motor Connected." );


但是,我希望能够在Matlab中做到这一点。

我已成功将dll加载到Matlab中,方法如下:

fullpathToPiUSBHeader = [pwd filesep 'picardStage' filesep 'PiUsb.h']
fullpathToPiUSBDll = [pwd filesep 'picardStage' filesep 'PiUsb.dll']
fullpathToPiUSBHeader = [pwd filesep 'picardStage' filesep 'PiUsb.h']

if not(libisloaded(fullpathToPiUSBHeader))
  loadlibrary(fullpathToPiUSBDll,fullpathToPiUSBHeader)
end

libfunctions('PiUsb','-full')


我返回了函数的完整列表,尤其是此函数:

[lib.pointer, int32Ptr] = piConnectMotor(int32Ptr, int32)


但是,当我尝试实现它时,我期望返回一个字符串,这意味着我需要将errorNumber初始化为字符串。但是,该函数将仅接受Int32Ptr作为数据类型。

到目前为止,这是我得到的:

xMotorSerialNumber = 12345;
errorNumber = libpointer('int32Ptr',{'PI_NO_ERROR','PI_DEVICE_NOT_FOUND'});
[xMotor, errorNumber] = calllib('PiUsb','piConnectMotor',errorNumber,xMotorSerialNumber)


但是我收到以下错误消息:

Array must be numeric or logical or a pointer to one


我认为这是由于errorNumber值是字符串而不是整数,但是当我使用时:

errorNumber = libpointer('int32Ptr',[0]);


无论是否连接设备,返回的errorNumber始终为“ 1”。

任何帮助将不胜感激!

最佳答案

看这里:

http://www.mathworks.com/help/matlab/ref/lib.pointer-class.html

代替:

errorNumber = libpointer('int32Ptr',[0]);


尝试:

errorNumber = libpointer('int32Ptr',0);


请记住,ErrorNumber是一个int,然后您需要将指向整数的指针传递给该函数。

最后,您可以尝试:

get(errorNumber)


调用函数后,查看errorNumber的值。

相反:

[xMotor, errorNumber] = calllib('PiUsb','piConnectMotor',errorNumber,xMotorSerialNumber)


尝试:

calllib('PiUsb','piConnectMotor',errorNumber,xMotorSerialNumber)

08-17 00:17