综述:
本文链接:http://www.embed-net.com/thread-565-1-1.html
本方案测试板购买链接:https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-15987418095.3.57dbe938EmY30m&id=545721383347
基于USB数据传输有非常多的上层协议,每种协议各有优缺点,本文介绍一种自定义USB协议实现的方式。
何为自定义USB协议,简单的说,就是实现最基本的USB双向数据通信,USB通信都是基于端点的,本文除了使用到端点0进行枚举之外,我们使用了两个端点,一个用于将数据从PC传输到单片机,一个用于将数据从单片机传输到PC。
PC端程序主要使用libusb来实现,为了方便使用使用,降低USB程序开发难度,我将libusb进行了再次封装,封装的函数如下所示:
[C] 纯文本查看 复制代码
01 02 03 04 05 06 07 08 09 10 |
|
在开始传输数据之前,一般需要先调用扫描设备函数,确定设备已经连接,然后调用打开设备函数,激活设备数据传输通道,然后就可以调用USBBulkWriteData,USBBulkReadData,USBIntWriteData,USBIntReadData,USBCtrlData进行数据传输了。
本文提供的固件只需要使用USBBulkWriteData,USBBulkReadData这两个函数即可,USBBulkWriteData函数实现PC向单片机发送数据,USBBulkReadData实现从单片机读取数据。
数据传输:
调用USBBulkWriteData函数后,数据将从OUT端点将数据发送到单片机,单片机接收到USB数据之后将会调用usbd_cdc_DataOut回调函数,然后在该函数里面将USB_ReceivedCount变量设置为接收到的数据字节数,如此,主函数就可以通过判断USB_ReceivedCount的值是否大于0来判断是否接收到了USB数据,接收到的USB数据会自动存放到USB数据接收缓冲区中。
调用USBBulkReadData函数后,主机将发起读数据操作,此时单片机端只需要调用DCD_EP_Tx函数即可将数据返回PC,当单片机将数据成功返回PC之后,usbd_cdc_DataIn函数会被自动调用,然后我们在里面将USB_StatusDataSended变量置1,如此,主函数就可以通过判断该变量是否为1来确定数据是否成功发送到PC端。
示例程序功能:
1,程序首先扫描设备,若设备已经连接,则打开设备;
2,程序发送两个信息给单片机,准备读取的数据包数,每包数据的大小;
3,单片机接收到第2步的两个信息之后,就开始循环发送数据,当然PC端也同步的循环读取数据;
4,数据传输完毕之后,统计数据传输的时间,然后打印输出传输数据的速度。
C/C++版本示例代码:
[C++] 纯文本查看 复制代码
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
|
C#版本的示例代码:
[C#] 纯文本查看 复制代码
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
|
Android版本的示例代码:
[Java] 纯文本查看 复制代码
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
|
测试效果如下所示: