最近一直在做EZ-USB的数据传输方面的东西,今天是捡起了多年没用过的VS并用C#编写了上位机部分的界面。今天的工作是建立在前几天的痛苦的经历上的。
之前一直想用Labview制作这个界面,因为labview这软件太惹人喜欢了,不需要写代码就能把工作做完,我先花了一天多去学了点LV的基本的操作,然后试着用它去调用cypress公司给的USB 的驱动程序(CyUSB.dl)可是问题来了,首先是LV不能识别这个驱动,说必须用32位版的LV才行。
我重新装了一个32位的,接下来更痛心的是,驱动是能识别了,可是里面的程序调用不了,根本不显示里面的程序。也许真的能调用只是我LV水平不够,不过如果在花大量的时间去学LV,估计也不是太可能了。进行到这一步,感觉很无奈,难道要我放弃这么好用的软件LV并且花了这么长时间研究的东西,去用别的软件来实现。
最终还是痛下决心,使用VS并用C#来编写,结果看来这个选择是对的,使用C#编写界面也很简单,而且编出来的界面要比LV要细致,毕竟是微软公司自己的软件在自家的平台上运行,做出来的界面我感觉还算满意把。然后就说说我编写是调用DLL文件的一些体会把。
要想调用DLL中的程序首先得清楚里面的函数才行,这一点最好办,cypress公司把所有相关的东西都做成了文档,下载下来看就行,而且这文档简直就是源代码啊,稍做修改就可以在程序中直接使用。其实好多公司都在这么做,这样的文档会极大的减轻工程师的工作。
多了不说,说说文档中的函数还有作用,由于全是英文的,看起来稍微费点劲,有些解释的不到位的欢迎指正。
对于文档中给出的这么多的函数和类,首先抓住其中最重要的一个类:USBDevices
这个类是CyUSB中的核心类,它会动态的呈现出当前已经连接到电脑的CyUSB设备,通过它可以单独的找出某个设备(通过设备的VID和PID)并与这个设备进行通信。这个类的使用举例如下:
USBDeviceList usbDevices = new USBDeviceList(CyConst.DEVICES_CYUSB);
myDev = usbDevices[0x04B4, 0x8613] as CyUSBDevice;// 获取第一个设备号为VendorID == 0x04B4 and ProductID == 0x8613的设备
然后很重要的一个函数就是:CyUSBDiceves
这个函数是连接CyUSB.sys驱动文件的一个关键类,通过它可以和USB设备进行各种通信,它里面的额函数暂且先不介绍,后面用到时再说。
然后最让我上心的就是CyControlEndPoint部分了,这部分是读写端点RAM时主要用到的东西。接下来且听细说。
说函数之前说说里面最重要的几个属性:Index,Target,ReqCode,ReqType,Value和Direction。最后的Direction调用时基本不会用到,后面会细说。
首先Index是与Target配套用的,如果Target设置的是TGT_ENDPT属性的话(一般如此),Index只的就是ENDPOINT的接口号。例如index = 2;说明当前使用的是EP2。
然后是ReqCode与ReqType是配套使用的。ReqCode是用来向USB设备声明有一条命令需要被执行(这是翻译过来的很拗口)说白了就是想USB请求执行命令,这个看名字也能猜个差不多。ReqType是向USB指示它该如何译码ReqCode从而控制数据的转移。也就是说不同的译码方式对应这不同的代码,不同的代码控制USB做不同类型(方向)的数据转移。
如果ReqCode为REQ_STD,则ReqCode的可能值可以在USB2.0的说明文档里面找(底层协议)。
如果ReqCode为REQ_CLASS,则ReqCode的可能值是被记录在设备的USB类中。
如果ReqCode为REQ_VENDOR,则ReqCode将会为设备声明一个针对不同厂商的专门的代码。
接下来说说这个类中的函数:Read();Write();XferData();
bool Read(ref byte[] buf,ref int len)
这个函数的返回值是bool类型,true表示读操作成功。
buf存储了当前读回的数据
len表示读回了多少byte的数据
需要注意的是在调用这个函数前必须先设置CyControlEndPoint类中的必要的属性,之前已经提到过了。
bool Write(ref byte[] buf,ref system.int32 len)
跟Read()类似此处不详述。
XferData()这个函数会在Read()和Write()函数中被内部调用,可以不显式出现。如果必须要用到是必须使用Direction属性指明方向,前面说Direction不常用就是这个原因。
这个DLL 中的函数太多,我们需要抓住我们需要的函数和类,然后依次往后倒,看在使用这个函数和类时又调用了什么,一次往下看,不能闲烦,看懂了也就这么些东西。这里我也没有说全,先写这么多,如果有在做这个的,可以找我一块讨论。