CyUSB.dll的调用经验介绍

本文分享了作者从尝试使用Labview到最终采用C#编写上位机软件的过程,详细介绍了如何利用Cypress公司的CyUSB库与EZ-USB设备交互,包括关键类和函数的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  最近一直在做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 中的函数太多,我们需要抓住我们需要的函数和类,然后依次往后倒,看在使用这个函数和类时又调用了什么,一次往下看,不能闲烦,看懂了也就这么些东西。这里我也没有说全,先写这么多,如果有在做这个的,可以找我一块讨论。















C#调用`cyusb.dll`,通常是涉及到与USB设备交互的场景,其中`cyusb.dll`是赛普拉斯(Cypress)提供的一个动态链接库,用于与该公司的USB控制芯片进行通信。要使用这个DLL,你需要通过C#中的P/Invoke(平台调用)功能来声明DLL中的函数和结构,以便在C#程序中直接调用这些函数。 下面是一个简单的步骤介绍如何在C#调用`cyusb.dll`: 1. 添加DLL引用:首先,确保`cyusb.dll`文件位于你的项目目录中或系统路径中,然后在C#项目中通过`DllImport`属性添加对该DLL的引用。 ```csharp using System; using System.Runtime.InteropServices; class Program { [DllImport("cyusb.dll", CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr CyUSB_GetDeviceList(); // 其他函数声明... } ``` 2. 函数声明:根据需要调用的`cyusb.dll`中的函数,使用`DllImport`和`StructLayout`等特性来声明这些函数和相关的结构体。 ```csharp // 示例:声明一个结构体 [StructLayout(LayoutKind.Sequential)] public struct CYUSB_DEVICE { // 结构体成员... } // 示例:声明一个函数 [DllImport("cyusb.dll", CallingConvention = CallingConvention.Cdecl)] public static extern int CyUSBDevice_GetNumInterfaces(IntPtr device, ref int numInterfaces); ``` 3. 使用声明的函数:声明了函数和结构体后,就可以在C#程序中像调用本地C#函数一样调用这些通过P/Invoke声明的DLL函数了。 ```csharp // 示例:使用函数获取USB设备列表 IntPtr deviceList = CyUSB_GetDeviceList(); ``` 4. 处理资源:在操作完USB设备后,需要适当地释放由`cyusb.dll`分配的资源,以避免内存泄漏或其他资源占用问题。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值