C#与USB设备通信

最近有一个项目,也是我硕士大论文要写的东西,就是从两个线阵相机上读取数据-->分析数据-->做到利用线阵相机检测接触线(铁路接触网)几何参数的功能。由于线阵相机是从武汉的一个创业公司买的,实在是坑死个人了,就是为了接收个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#程序,博客删除了,留了邮箱,我问他寻求帮助时,他跟我要钱,擦,杀人都有。我共享我的程序,帮助需要帮助的人。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容