搜索
aardio官方社区 门户 查看主题

API结构体参数问题。

发布者: 金满斗 | 发布时间: 2016-11-21 15:46| 查看数: 1022| 评论数: 3|帖子模式

    现在电脑上很多都不带com口了,因此很多通讯要用usb口了,前几天试着调用一个usbhid的通讯dll,没有调用成功。主要有些东西还是没理解透,大家指点下我这么写对吗?
dll的说明文档可以参考这里:http://www.kadtronix.com/usbhidapi_usr.htm
我准备读取所以列表,就是要调用这个函数:GetList
说明截图:
1.jpg

这个函数我的理解几个参数  前2个是数值id,后3个是指针,第6个是个结构体指针 mdeviceList,第7个是结构体指针的长度。

因此我库里这样定义

  1. GetList = UsbHid.api("GetList","int(INT VendorID,INT ProductID ,string& Manufacturer,string& SerialNum,string& DeviceName,struct&  pList,int  nMaxDevices)")
复制代码


结构体看说明是这样的:
2.jpg

我试着这样定义

  1. mdeviceList := class {
  2.         byte DeviceName[50]; // Device name
  3.         byte Manufacturer[50]; // Manufacturer
  4.         byte SerialNumber[20]; // Serial number r
  5.     INT     VendorID;         // Vendor ID
  6.     INT     ProductID;        // Product ID
  7.     int     InputReportLen;   // Length of HID input report (bytes)
  8.     int     OutputReportLen;  // Length of HID output report (bytes)
  9.     int     Interface;        // Interface  
  10.     int     Collection;  
  11. }
复制代码


调用代码截图:
3.jpg

运行之后就是不能读出数据,取回的都为空,我后来看他C的资料,看到这么一段
4.jpg

5.jpg

VB里是调用的mdeviceList2这种类型的结构体,

我又试着定义了个

  1. mdeviceList2 := class {
  2.         string  DeviceName ; // Device name
  3.     string  Manufacturer;   // Manufacturer
  4.     string  SerialNumber ;  // Serial number
  5.     INT     VendorID ;         // Vendor ID
  6.     INT     ProductID ;        // Product ID
  7.     int     InputReportLen ;   // Length of HID input report (bytes)
  8.     int     OutputReportLen ;  // Length of HID output report (bytes)
  9.     int     Interface ;        // Interface  
  10.     int     Collection ;  
  11.        
  12. }
复制代码


当然,前面3个文本参数的我换成指针了也试验过,就是不能读出数据,返回的id什么的都为0。
绕来绕去我也晕了,我想问一下,我这样定义和调用有错吗?由于例子上的vb我电脑上没装,再说也不懂,也不能确定这个dll是不是真的行。

最新评论

popdes 发表于 2016-11-22 12:51:43
这个dll可能有问题,我重新找了个hid相关的dll,文档在http://www.signal11.us/oss/hidapi/hidapi/doxygen/html/group__API.html#ga142ffc1b0b7a7fa412d3862b2a17164b
相关的dll下载在:http://pan.baidu.com/s/1c1IyHzy
打开什么的都搞定了,但是写入write不行,求指导
popdes 发表于 2016-11-24 21:17:12
搞定了,利用另外一个dll,这里我发代码出来,大家看看
首先,我自己定义了一个用户hid库文件,名字Usbhidapi.aardio
  1. //Usbhidapi用户库
  2. namespace Usbhidapi;

  3. var dll = ..raw.loadDll($"\res\hidapi.dll", , "cdecl");
  4. //初始化函数,0成功,-1失败
  5. Hidapi_init= dll.api("hid_init","int(void)");
  6. //释放端口函数,0成功,-1失败
  7. Hidapi_exit= dll.api("hid_exit","int(void)");
  8. //枚举端口
  9. Hidapi_enumerate= dll.api("hid_enumerate","struct(WORD vendor_id, WORD product_id)","cdecl");
  10. //释放枚举端口
  11. Hidapi_free_enumeration= dll.api("hid_free_enumeration","void(struct devs)","cdecl");
  12. //vid和pid方式打开端口
  13. Hidapi_open= dll.api("hid_open","pointer(WORD vendor_id, WORD product_id, string serial_number)","cdecl");
  14. //路径名方式打开
  15. Hidapi_open_path= dll.api("hid_open_path","pointer(STRING path)","cdecl");
  16. //发送数据函数,返回发送成功的长度 或者 发送失败-1
  17. Hidapi_write= dll.api("hid_write","int(POINTER device, pointer data, INT length)","cdecl");
  18. //读取(超时方式)
  19. Hidapi_read_timeout= dll.api("hid_read_timeout","int(POINTER device, pointer data, INT length, INT milliseconds)","cdecl");
  20. //读取(普通方式)
  21. Hidapi_read= dll.api("hid_read","int(POINTER device, pointer data, INT length)","cdecl");
  22. //设置阻塞模式 0 使用,1 不使用
  23. Hidapi_set_nonblocking= dll.api("hid_set_nonblocking","int(POINTER device, int nonblock)","cdecl");
  24. //发送功能报告
  25. Hidapi_send_feature_report= dll.api("hid_send_feature_report","int(POINTER device, pointer data, int length)","cdecl");
  26. //获取功能报告
  27. Hidapi_get_feature_report= dll.api("hid_get_feature_report","int(POINTER device, pointer data, int length)","cdecl");
  28. //关闭端口函数
  29. Hidapi_close = dll.api("hid_close","void(POINTER device)","cdecl");
  30. //获取用户码
  31. Hidapi_get_manufacturer_string= dll.api("hid_get_manufacturer_string","int(POINTER device, ustring& data, INT maxlen)","cdecl");
  32. //获取产品码
  33. Hidapi_get_product_string= dll.api("hid_get_product_string","int(POINTER device, ustring& data, int maxlen)","cdecl");
  34. //获取序列号
  35. Hidapi_get_serial_number_string= dll.api("hid_get_serial_number_string","int(POINTER device, ustring& data, int maxlen)","cdecl")
  36. //获取字符(按照给定的帧首[string_index]获取 1=manufacturer_strin, 2=product_string, 3=serial_number_string),同上面的功能一样
  37. Hidapi_get_indexed_string= dll.api("hid_get_indexed_string","int(POINTER device, int string_index, ustring& data, int maxlen)","cdecl");
  38. //获取错误信息
  39. Hidapi_error= dll.api("hid_error","ustring(POINTER device)","cdecl");
复制代码


然后就是界面实现和使用逻辑.

名称:main.aardio
  1. import win.ui;
  2. import Usbhidapi;
  3. import console;
  4. /*DSG{{*/
  5. mainForm = win.form(text="aardio form";right=691;bottom=408;border="dialog frame")
  6. mainForm.add(
  7. Rxdata={cls="listbox";left=429;top=57;right=650;bottom=128;edge=1;items={};z=20};
  8. Txdata={cls="edit";text="123456abcd";left=136;top=101;right=304;bottom=134;align="center";edge=1;z=19};
  9. button={cls="button";text="初始化";left=40;top=146;right=140;bottom=181;z=1};
  10. button10={cls="button";text="设置非阻塞";left=40;top=251;right=140;bottom=286;z=10};
  11. button11={cls="button";text="发送功能报告";left=381;top=146;right=481;bottom=181;z=11};
  12. button12={cls="button";text="获取功能报告";left=381;top=199;right=481;bottom=234;z=12};
  13. button13={cls="button";text="关闭";left=553;top=302;right=653;bottom=337;z=13};
  14. button14={cls="button";text="获取用户码";left=219;top=146;right=319;bottom=181;z=14};
  15. button15={cls="button";text="获取产品码";left=219;top=198;right=319;bottom=234;z=15};
  16. button16={cls="button";text="获取序列号";left=219;top=251;right=319;bottom=286;z=16};
  17. button17={cls="button";text="获取首字符";left=219;top=304;right=319;bottom=338;z=17};
  18. button18={cls="button";text="获取错误信息";left=553;top=248;right=653;bottom=283;z=18};
  19. button2={cls="button";text="退出";left=553;top=356;right=653;bottom=392;z=2};
  20. button3={cls="button";text="枚举";left=381;top=304;right=481;bottom=339;z=3};
  21. button4={cls="button";text="释放枚举";left=381;top=357;right=481;bottom=391;z=4};
  22. button5={cls="button";text="普通方式打开";left=40;top=198;right=140;bottom=234;z=5};
  23. button6={cls="button";text="路径名方式打开";left=381;top=252;right=481;bottom=286;z=6};
  24. button7={cls="button";text="发送";left=40;top=304;right=140;bottom=340;z=7};
  25. button8={cls="button";text="读取(超时)";left=219;top=356;right=319;bottom=391;z=8};
  26. button9={cls="button";text="读取";left=40;top=357;right=140;bottom=391;z=9};
  27. static={cls="static";text="发送数据:";left=63;top=109;right=121;bottom=132;transparent=1;z=21};
  28. static2={cls="static";text="接收数据:";left=356;top=106;right=413;bottom=125;transparent=1;z=22};
  29. static3={cls="static";text="UsbHid库调用示例";left=241;top=12;right=436;bottom=50;align="center";font=LOGFONT(h=-24);transparent=1;z=23}
  30. )
  31. /*}}*/

  32. hid_device_info = class {
  33.     string path ;
  34.     WORD vendor_id ;
  35.     WORD product_id ;
  36.     ustring serial_number;
  37.     WORD release_number ;
  38.     ustring manufacturer_string ;
  39.     ustring product_string ;
  40.     WORD usage_page ;
  41.     WORD usage;
  42.     int interface_number;
  43.     pointer next ;
  44. };

  45. //转换成AISCII
  46. Aiscii=function(data,len){
  47.     var str="";           
  48.         for(i=1;len;1){
  49.             str ++=string.pack(data[i]);
  50.         }
  51.     return str;
  52. }

  53. var Hiddevice;

  54. mainForm.button3.oncommand = function(id,event){
  55.     //mainForm.msgbox( mainForm.button3.text );
  56.     var devs = hid_device_info();
  57.     var cur_dev;
  58.      
  59.     var devlist = Usbhidapi.Hidapi_enumerate(0,0);
  60.     cur_dev = raw.convert(devlist,hid_device_info());
  61.     while(cur_dev){
  62.         console.dump(cur_dev);
  63.         cur_dev = cur_dev.next;
  64.         if(cur_dev){
  65.             cur_dev = raw.convert(cur_dev,hid_device_info());
  66.         }
  67.         else {
  68.             break;
  69.         }
  70.          
  71.     }
  72.      
  73.      
  74. }

  75. mainForm.button6.oncommand = function(id,event){
  76.     //mainForm.msgbox( mainForm.button6.text );
  77.     //mainForm.msgbox( "这个功能下面的写的不对,就没测了" );


  78. /*
  79.     var str = "\\?\hid#vid_5555&pid_5555#6&8282ff9&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}";
  80.     Hiddevice = Usbhidapi.Hidapi_get_feature_report(str);
  81.     if(Hiddevice){
  82.         console.log("路径方式打开成功!")
  83.     }else {
  84.         console.log("路径方式打开失败!")
  85.     }
  86. */


  87. }

  88. mainForm.button12.oncommand = function(id,event){
  89.     mainForm.msgbox( "硬件电路里面没有使用到控制端点,所以这个功能没有测试" );
  90.     //硬件电路里面没有使用到控制端点,所以这个功能没有测试
  91. /**
  92.     var buf = raw.buffer(1000, 0);
  93.     var len = 100;
  94.     var Rxlength = Usbhidapi.Hidapi_get_feature_report(Hiddevice, buf, len);
  95.     if(Rxlength == -1){
  96.         console.log("读取失败!")
  97.     }else {
  98.         console.log("读取成功!!读取长度为:",Rxlength,'\n读取到:' /*,raw.tostring(databuf)*/);
  99.         //console.log(raw.tostring(databuf, 1, Rxlength));
  100.         if(Rxlength == 0){
  101.             return; //没数据退出
  102.         }
  103.         var str = "";
  104.         str = Aiscii(buf,Rxlength);
  105.          
  106.         mainForm.Rxdata.add(str);
  107.         console.log(str);
  108.     }
  109. **/
  110.      
  111. }

  112. mainForm.button11.oncommand = function(id,event){
  113.     mainForm.msgbox( "硬件电路里面没有使用到控制端点,所以这个功能没有测试" );
  114.     //硬件电路里面没有使用到控制端点,所以这个功能没有测试
  115. /*
  116.     var Txlength = Usbhidapi.Hidapi_send_feature_report(Hiddevice,'\0'+mainForm.Txdata.text,#mainForm.Txdata.text+1);
  117.     if(Txlength == -1){
  118.         console.log("发送失败!")
  119.     }else {
  120.         console.log("发送成功!!发送长度为:",Txlength)
  121.     }  

  122. */
  123. }

  124. mainForm.button8.oncommand = function(id,event){
  125.     //mainForm.msgbox( mainForm.button8.text );
  126.     var buf = raw.buffer(1000, 0);
  127.     var len,ms = 100,1000;
  128.     var Rxlength = Usbhidapi.Hidapi_read_timeout(Hiddevice, buf, len, ms);
  129.     if(Rxlength == -1){
  130.         console.log("读取失败!")
  131.     }else {
  132.         console.log("读取成功!!读取长度为:",Rxlength,'\n读取到:' /*,raw.tostring(databuf)*/);
  133.         //console.log(raw.tostring(databuf, 1, Rxlength));
  134.         if(Rxlength == 0){
  135.             return; //没数据退出
  136.         }
  137.         var str = "";
  138.         str = Aiscii(buf,Rxlength);
  139.          
  140.         mainForm.Rxdata.add(str);
  141.         console.log(str);
  142.     }  
  143.      
  144. }

  145. mainForm.button17.oncommand = function(id,event){
  146.     //mainForm.msgbox( mainForm.button17.text );
  147.     var buf = raw.buffer(1000);
  148.     //var buf= "";
  149.     var Maxlen = 255;
  150.     var ret,buf2= Usbhidapi.Hidapi_get_indexed_string(Hiddevice,3,buf,Maxlen);
  151.     if(ret == -1){
  152.         console.log("获取首字符失败!")
  153.     }else {
  154.         console.log("获取首字符成功!")
  155.         console.log("首字符为:",buf2);

  156.     }  
  157.      
  158. }

  159. mainForm.button16.oncommand = function(id,event){
  160.     //mainForm.msgbox( mainForm.button16.text );
  161.      
  162.     var buf = raw.buffer(1000);
  163.     //var buf= "";
  164.     var Maxlen = 255;
  165.     var ret,buf2= Usbhidapi.Hidapi_get_serial_number_string(Hiddevice,buf,Maxlen);
  166.     if(ret == -1){
  167.         console.log("获取序列号失败!")
  168.     }else {
  169.         console.log("获取序列号成功!")
  170.         console.log("序列号为:",buf2);

  171.     }
  172. }

  173. mainForm.button15.oncommand = function(id,event){
  174.     //mainForm.msgbox( mainForm.button15.text );
  175.     var buf = raw.buffer(1000);
  176.     //var buf= "";
  177.     var Maxlen = 255;
  178.     var ret,buf2= Usbhidapi.Hidapi_get_product_string(Hiddevice,buf,Maxlen);
  179.     if(ret == -1){
  180.         console.log("获取产品码失败!")
  181.     }else {
  182.         console.log("获取产品码成功!")
  183.         console.log("产品码为:",buf2);

  184.     }  
  185.      
  186. }

  187. mainForm.button14.oncommand = function(id,event){
  188.     //mainForm.msgbox( mainForm.button14.text );
  189.     var buf = raw.buffer(1000);
  190.     //var buf= "";
  191.     var Maxlen = 255;
  192.     var ret,buf2= Usbhidapi.Hidapi_get_manufacturer_string(Hiddevice,buf,Maxlen);
  193.     if(ret == -1){
  194.         console.log("获取用户码失败!")
  195.     }else {
  196.         console.log("获取用户码成功!")
  197.         console.log("用户码为:",buf2);

  198.     }
  199.      
  200. }

  201. mainForm.button13.oncommand = function(id,event){
  202.     //mainForm.msgbox( mainForm.button13.text );
  203.     Usbhidapi.Hidapi_close(Hiddevice);
  204.     console.log("已经关闭");
  205.      
  206. }

  207. //var buf = raw.buffer(100, 0);
  208. mainForm.button9.oncommand = function(id,event){
  209.     //mainForm.msgbox( mainForm.button9.text );
  210.     var buf = raw.buffer(1000, 0);
  211.     var len = 100;
  212.     var Rxlength = Usbhidapi.Hidapi_read(Hiddevice, buf, len);
  213.     if(Rxlength == -1){
  214.         console.log("读取失败!")
  215.     }else {
  216.         console.log("读取成功!!读取长度为:",Rxlength,'\n读取到:' /*,raw.tostring(databuf)*/);
  217.         //console.log(raw.tostring(databuf, 1, Rxlength));
  218.         if(Rxlength == 0){
  219.             return; //没数据退出
  220.         }
  221.         var str = "";
  222.         str = Aiscii(buf,Rxlength);
  223.          
  224.         mainForm.Rxdata.add(str);
  225.         console.log(str);
  226.     }  
  227.      
  228. }


  229. mainForm.button7.oncommand = function(id,event){
  230.     //mainForm.msgbox( mainForm.button7.text );
  231.     var Txlength = Usbhidapi.Hidapi_write(Hiddevice,'\0'+mainForm.Txdata.text,#mainForm.Txdata.text+1);
  232.     if(Txlength == -1){
  233.         console.log("发送失败!")
  234.     }else {
  235.         console.log("发送成功!!发送长度为:",Txlength)
  236.     }  
  237.      
  238. }


  239. mainForm.button10.oncommand = function(id,event){
  240.     //mainForm.msgbox( mainForm.button10.text );
  241.     var ret = Usbhidapi.Hidapi_set_nonblocking(Hiddevice, 1);
  242.     if(ret == -1){
  243.         console.log("设置非阻塞模式失败!")
  244.     }else {
  245.         console.log("设置非阻塞模式成功!")
  246.     }  
  247.      
  248. }


  249. mainForm.button5.oncommand = function(id,event){
  250.     //mainForm.msgbox( mainForm.button5.text );
  251.     Hiddevice = Usbhidapi.Hidapi_open(21845, 21845, null);
  252.     if(Hiddevice){
  253.         console.log("Vid和Pid方式打开成功!")
  254.     }else {
  255.         console.log("Vid和Pid方式打开失败!")
  256.     }
  257. }


  258. mainForm.button.oncommand = function(id,event){
  259.     //mainForm.msgbox( mainForm.button.text );
  260.      
  261.     var ret = Usbhidapi.Hidapi_init();
  262.     if(ret == -1){
  263.         console.log("初始化失败!")
  264.     }else {
  265.         console.log("初始化成功!")
  266.     }
  267.      
  268. }
  269. mainForm.show()
  270. return win.loopMessage();
复制代码


下面是这个软件实现后的图片.


源码下载http://pan.baidu.com/s/1hsbT6Eo
金满斗 发表于 2016-11-25 07:33:44
不错。恭喜恭喜。

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2017-9-25 19:22 , Processed in 0.062500 second(s), 21 queries , WinCache On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表