STM32F4自定义USB协议高速数据传输,支持Windows,Linux,Max,Android
综述:本文链接: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数据传输有非常多的上层协议,每种协议各有优缺点,本文介
综述:
本文链接: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 |
|
测试效果如下所示:

更多推荐



所有评论(0)