我是在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)