usb芯片CH372的dll调用
By
admin
at 2017-12-10 • 0人收藏 • 1260人看过
这里主要记录研究过程:
函数原型的调用
var dll = ..raw.loadDll($"\res\xxxDLL.dll",,"cdecl");
为什么后面要用cdecl这个调用约定?
我自己的理解是这个dll是用vc++写的,风格呢就是c的风格,所以调用约定指定为C
Xxxdll_OpenDevice = dll.api("xxxdll_OpenDevice","int(void)");
它的原型是
int HUAVEDAQ_OpenDevice(void)
下一个函数
Xxxdll_ReadSingleLightPower= dll.api("Xxxdll_ReadSingleLightPower","int( INT channel, INT lightWavelenght, float &LightPower )")
原型为
int Xxxdll_ReadSingleLightPower( unsigned char channel, unsigned char lightWavelenght, float *LightPower )
还有一个
Xxxdll_ReadVersion= dll.api("Xxxdll_ReadVersion","int( pointer str)");
原型为
int Xxxdll_ReadVersion( char *str )
这里需要注意的是最后一个,因为版本号的读取,c原型里面是用的指针指向数组的头,是一个字节一字节的数据,所以这样写.
这些操作完成后,需要调用
mainForm.button4.oncommand = function(id,event){ var status,power = Xxxdll_ReadSingleLightPower(1,1,0);//最后一个参数,需要随机填入一个数字,要不然指针会是Null,而报错 if(status!=0){ console.log("读取失败") } console.log(power) ; }
这里要注意注释部分(110)的0,是随机写的,什么数字都可以的
,要特别注意这里的写法:
float &LightPower
这样写是因为aardio中这样规定的,所有原型中修改的数据,必须在输出中体现!
下面是读版本号
mainForm.button.oncommand = function(id,event){ var str = raw.malloc(1000); var status=Xxxdll_ReadVersion(str); var straa = "" straa = initif(str,16 ); console.log(straa) ; }
因为我们的dll里面已经规定版本号是16个字节,所以我这里填写的是16.
第一步给数据分配空间,
第二步获取str这个指针
第三步,取这个指针的数据,按字节进行处理,
//转换为HEX码 var Hex=function(data,len){ var str=""; for(i=1;len;1){ str = str++" "++string.right(string.format("X", data[ i ]),2);//默认转换成有符号字节,因此取最右边两位 HEX码 } return str;
这里参考了以前的帖子里面的串口助手的写法.
登录后方可回帖