C#与USB设备通信

1 篇文章 0 订阅
1 篇文章 0 订阅

最近有一个项目,也是我硕士大论文要写的东西,就是从两个线阵相机上读取数据-->分析数据-->做到利用线阵相机检测接触线(铁路接触网)几何参数的功能。由于线阵相机是从武汉的一个创业公司买的,实在是坑死个人了,就是为了接收个USB发送过来的数据,费了我好大力气,大哭!说实话,其实也没什么,只不过是让他们的Demo程序给唬住了,过程很心酸,就不多说了。下面说一下我用C#从USB设备接收数据的几点心得吧,注意看哦,微笑

一,首先要安装USB设备的驱动程序。必须的第一步,有些设备会自带USB驱动程序,有些设备呢,可能没有驱动了,那么我们就需要知道该设备的具体的USB芯片类型,下载相应驱动。不多说。

二,初始阶段,打开百度,搜索“C#USB通讯或者C#接收USB数据”,比较典型的是下面三篇文章:

http://blog.sina.com.cn/s/blog_4850c0e90100n870.html
http://blog.sina.com.cn/s/blog_683967620102uwsq.html
http://m.blog.csdn.net/blog/cumtwys/38371419
其中两篇是讲的LibUSB,是一个开源的USB类库叫LibUSBDotNet。我按照文章中的要求一步一步的配置好我的工程,但是最终连USB设备都没发现, 哭。还有一篇文章是直接用的win32api的,这方面我不是很了解,用到了[DllImport("kernel32.dll")],引用了kernel32.dll程序集,还是没有发现设备...

三,再接着搜,发现很多上面类似的资料,咋办呢?去图书馆借了本USB方面的书,书上说C#开发USB上位机不是很方便,而用C++开发就很方便了,无奈要写一个带图形界面的上位机程序,对方给的Demo程序又那么扯淡(用MFC开发的,实时接收相机传送的数据,并绘制出波形图,但是他这个程序没写好,没传送一次数据,屏幕就刷新一次,效果太差,而mfc方面网上的资料也不是很好找,所以决定用C#搞定这个东西,毕竟C#可用资料比较多,而且之前做过很多C#+GDI画图显示波形的工程了)。

书上提到了:Cypress,这是一个公司啊。是Cypress为其EZ-USB系列USB接口芯片提供了一个全新的.NET平台开发包--Cypress Suite USB,目前最新的版本为Cypress Suite USB 3.4.7。这个开发包中,C#有一些上位机Demo和上位机开发使用的动态链接库CyUSB.dll。注意,C++使用的库文件是CyAPI.lib文件,与C#的不同,他们只能引用自己对应后缀的库文件。可不能搞混哦。那么,C#上位机只需要CyUSB.dll就可以了。

此处插入一部分,讲一下EZUSB和CYUSB及上位机的区别:

如果你的固件里VID ,PID是04B4,1002(或者其他,具体看ezusbw2k.inf文件的支持),那么这个时候你对应的驱动就是EZUSB驱动文件 ezusb.sys、ezusbw2k.inf,这个驱动就是所谓的通用驱动GPD( General Purpose Drive);相应的,控制台使用EZ-USB Control Panel进行调试。EZUSB驱动文件、控制台软件,固件例子,上位机例子可以通过安装CypressEZ-USBDevelopmentKit开发包得到,版本号是261700,可以到CYPRESS官网下载。相应的,如果你的VID,PID是04B4,1004(或者其他,具体看inf文件 支持),那么你对应的驱动应该是cyusb.sys,cyusbpre.inf,控制台使用Cypress USB Console。

我们使用的事CyUSB,可以百度搜索CyUSB,会有很多这方面的资料的。终于找到入口了,吐舌头。而我的设备vid和pid分别是0x04b4和1004。其实如果你没有设备驱动的话,Cypress Suite USB开发包中也包含驱动的,可以自己装上。

四,讲一下上位机程序的开发过程。首先要把CyUSB.dll添加引用到自己的项目中。步骤如下:

(1)建立WinForm项目(不多说)

(2)在项目(不是解决方案啊,记住)右键--添加引用--浏览--找到CyUSB.dll--确定,ok

(3)既然我们已经把程序集类库添加进入我们的工程里面了,那么我们要想使用该类库的话,就要在建立的WinForm窗体程序中的using部分添加

"using CyUSB;"就可以了,下面的程序中就可以直接使用了。很简单吧,大笑

(4)写接收数据的程序,里面有很多控制类,USBDeviceList,CyUSBDevice,CyControlEndPoint...很多控制类。我们要接收数据的话只用到了USBDeviceList,CyUSBDevice,CyControlEndPoint,CyBulkEndPoint,CyUSBEndPoint个类。简单介绍一下,USBDeviceList:它提供了USB设备列表信息,支持USB驱动,USB HID设备(鼠标,键盘等)和USB大容量存储设备的识别;CyUSBDevice:他提供了USB设备的信息列表,通过该类中的函数及成员变量可以获知USB设备的各类属性参数。这些函数呢,下面程序中会直接用到,就不一一列举了CyControlEndPoint:它提供了USB设备控制端点的读写及设置,通过该类中的函数及成员变量可以实现USB设备的控制传输操作,其中的几个参数,下面程序会列举到;CyBulkEndPoint:他是CyUSBEndPoint类的子类,提供了对USB块传输端点的控制。通过该类中的函数及成员变量可以实现USB设备的块传输操作,下面程序用用于接收数据时可以使用CyBulkEndPoint类,也可以使用CyUSBEndPoint类,都可以。

(5)具体程序,片段:

public partial class Main:Form

{

        private USBDeviceList usbDevices = new USBDeviceList(CyConst.DEVICES_CYUSB);//获取列表
        private CyUSBDevice myDev;
        private CyControlEndPoint CtrlEndPt;
        private CyBulkEndPoint cbep1;
        private CyIsocEndPoint InEndpt;
        private CyUSBEndPoint cuep;
        private StringBuilder sb = new StringBuilder();
        private byte[] buffer=new byte[10240];//接收数据的字节数组
        private uint[] ccddata = new uint[5000];//组合后的数组

        public Main()
        {
            InitializeComponent();
            myDev = usbDevices[0] as CyUSBDevice;
            CtrlEndPt = null;
            if (myDev != null)
            {
                CtrlEndPt = myDev.ControlEndPt;//获取控制端点
                xferdataControl((byte)0xB2);//传输控制参数,根据USB设备的不同自行处理,反正我的设备是需要先传输控制参数的。
            }
        }

        //P0Start//P0Stop
        private void xferdataControl(byte x) //传输控制参数的函数
        {
            if (CtrlEndPt != null)
            { //下面的这几个参数根据你的具体设备自行设置
                CtrlEndPt.Target = CyConst.TGT_DEVICE;
                CtrlEndPt.ReqType = CyConst.REQ_VENDOR;
                CtrlEndPt.Direction = CyConst.DIR_TO_DEVICE;
                CtrlEndPt.ReqCode = x;
                CtrlEndPt.Value = 0;//0
                CtrlEndPt.Index = 0;

                int len = 2;
                byte[] buf = new byte[len];
                buf[0] = x;
                buf[1] = 0;
                CtrlEndPt.XferData(ref buf, ref len); //传输控制参数时使用CtrlEndPt端口类,与接收数据的端口类不同,请注意,接收数据时使用//CyBulkEndPoint或者CyUSBEndPoint都可以。
            }
        }
       
        //读取数据,注意接收 数据的XferData与传输控制参数是的XferData有很多不同,一定要注意。
        private void getData()
        {
            byte x = (byte)0xb2;//关闭
            byte y = (byte)0xb1;//开启
            //xferdataControl(x);
            xferdataControl(x);
            xferdataControl(x);
            xferdataControl(y);
            //执行读取数据
            int by = 10240;

            myDev.EndPoints[1].TimeOut = 20;
            myDev.EndPoints[1].XferData(ref buffer, ref by);
            //或者使用如下方法接收数据:
            //方法一:
            //cbep1 = myDev.BulkInEndPt;
            //cbep1.TimeOut = 20;
            //cbep1.XferData(ref buffer, ref  by);
            //方法二:
            //myDev.BulkInEndPt.TimeOut = 20;
            //myDev.BulkInEndPt.XferData(ref buffer, ref  by);

           

            for (int j = 0, i = 2; j < 5000; i += 2, j++)
            {
                ccddata[j] = Convert.ToUInt32(buffer[i + 1]) * 256 + Convert.ToUInt32(buffer[i]);
            }
            xferdataControl(x);//stop
            //cuep = new CyUSBEndPoint();

            //cbep1 = myDev.BulkInEndPt;
            //cbep1.TimeOut = 20;
            //cbep1.XferData(ref buffer, ref  by);

            //myDev.BulkInEndPt.TimeOut = 20;
            //myDev.BulkInEndPt.XferData(ref buffer, ref  by);
            //myDev.ControlEndPt.TimeOut = 20;
            //myDev.ControlEndPt.XferData(ref buffer, ref by);
        }

}

(6)数据接收完毕,可以测试了。针对不同的设备,一些配置参数可能会不同,但是大体上是一致的。都是用如上程序中用到的这几个类。如果遇到这样的问题,可以一方面查资料CyUSB,一反面看看有关的书。谢谢,请提出宝贵意见。希望对你有帮助!哦,对了,之前遇到了一个尿人,妈的他写过这样的C#程序,博客删除了,留了邮箱,我问他寻求帮助时,他跟我要钱,擦,杀人都有。我共享我的程序,帮助需要帮助的人。

  • 52
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 40
    评论
### 回答1: USB设备远程共享是指通过网络连接的方式,将USB设备连接到一台计算机上,然后让其他计算机也能够通过网络使用该USB设备的功能。这种方式可以使多台计算机同时使用同一个USB设备,方便了用户的操作。 USB设备远程共享的原理是在连接USB设备的计算机上安装一个USB设备服务器软件,该软件会将USB设备转换成网络数据包进行传输。其他要使用该USB设备的计算机需要安装USB设备客户端软件,通过网络连接到USB设备服务器,然后就可以像连接本地USB设备一样使用远程共享的USB设备了。 远程共享USB设备的好处是可以实现多台计算机之间资源共享,节省了用户的成本和空间。例如,在一家公司的办公室中,只需要一台打印机,并通过USB设备远程共享让所有员工的电脑都能够使用这台打印机,就能够满足工作的需求,而不需要给每个员工都配备一台打印机。 USB设备远程共享也有一些限制,首先是网络的速度和稳定性,如果网络不稳定或者速度很慢,使用远程共享的USB设备可能会变得卡顿或者无法使用。其次,一些特殊的USB设备可能不支持远程共享功能,需要根据具体的USB设备来判断是否可以进行远程共享。 总的来说,USB设备远程共享是一种便利的技术,可以使多台计算机共享一个USB设备,提高了办公效率和资源利用率。但是在使用过程中,还需要考虑网络的稳定性和设备的兼容性等问题。 ### 回答2: USB设备远程共享是指通过网络将USB设备连接到远程计算机并共享该设备的功能。这种功能通常用在远程办公、远程控制和远程协作等场景中。 USB设备远程共享的实现需要使用特定的软件或硬件设备,其中最常见的方式是使用USB设备服务器。USB设备服务器是一种可以将USB设备连接到网络的设备,它会将USB接口转为网络接口,使得USB设备可以通过网络与远程计算机进行通信。 通过USB设备服务器,用户可以在本地计算机上安装相应的驱动程序和共享软件,然后将USB设备连接到USB设备服务器。通过网络,远程计算机可以访问共享软件,并将其识别为远程设备,从而实现对USB设备的远程共享和控制。 USB设备远程共享的优势在于可以实现远程设备的共享和使用,不再局限于物理连接。这对于需要在远程环境中使用USB设备的用户来说非常方便。例如,在远程会议中,用户可以将摄像头、麦克风等USB设备连接到USB设备服务器并共享给远程参会人员,从而实现更好的远程协作体验。此外,也可以通过远程共享USB设备来远程访问文件、打印文档等操作,提高工作效率。 需要注意的是,USB设备远程共享需要保证网络的稳定性和带宽的充足性,以确保远程设备的实时响应和流畅使用。此外,也要注意安全性问题,避免远程设备被未授权的用户滥用或侵犯隐私。因此,在进行USB设备远程共享时,需要选择可靠的软件和设备,并采取相应的安全措施来保护用户的数据和隐私。 ### 回答3: USB设备远程共享是指通过网络将USB设备连接到一台远程计算机上,使得远程计算机可以访问和使用USB设备。 实现USB设备远程共享的一种方法是使用虚拟化技术。虚拟化技术可以创建一个虚拟的USB设备接口,将USB设备的信号传输通过网络发送给远程计算机,远程计算机接收到信号后就可以像本地USB设备一样使用该设备USB设备远程共享的好处包括: 1. 方便共享:可以将一台USB设备共享给多台计算机使用,提高设备的利用率。 2. 节省成本:无需购买额外的USB设备,节省了硬件成本。 3. 提高灵活性:用户可以在任何地点通过网络访问和使用USB设备,无需受到地理位置限制。 4. 增强安全性:可以对USB设备进行权限管理和监控,有效防止数据泄漏和设备滥用的风险。 至于实现USB设备远程共享的具体方法,可以使用专门的USB设备共享软件或者使用远程桌面协议。这些软件和协议可以将本地USB设备映射到远程计算机上,并提供相应的控制和访问权限。 总之,USB设备远程共享是一种方便实用的技术,可以提高USB设备的利用率和灵活性,同时也增强了数据安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 40
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值