搜索
bottom↓
回复: 57

STM32F4自定义USB数据传输,支持Windows,Linux,Android,速度高达1MByte

  [复制链接]

出0入0汤圆

发表于 2016-6-6 12:04:26 | 显示全部楼层 |阅读模式
功能简介:
1,自定义USB协议实现数据传输,采用Bulk传输模式,两个Bulk端点,一个输入,一个输出;
2,PC端驱动支持Windows,Linux,Mac,Android,树莓派,除了安卓之外,其他的代码为同一套代码,只需要在不同的系统下重新编译即可;
3,非常简单的USB接口,只需要更换PID和VID即可使用在自己的系统中,PC和单片机端单次收发数据最大可达64KByte;
4,安卓端支持USB设备插拔检测,插入设备之后自动弹出授权对话框授权,拔出设备之后可以通过回调函数方式通知上层应用;
5,所有源码全部开放,毫无保留,程序逻辑清晰,注释清楚详细;

部分系统实测图:




代码构成简介:
为方便移植管理,USB底层数据传输封装成了一个名为USBTransmit的库,当然这个库也会提供全部源码,上层应用基于这个库实现USB设备的管理和数据收发即可;
USBTransmit库接口定义如下:
  1. #ifndef __USBTRANSMIT_H__
  2. #define __USBTRANSMIT_H__

  3. // Device endpoint(s)
  4. #define EP0     0x00
  5. #define EP1_IN  0x81    //wMaxPacketSize:   64        Bulk
  6. #define EP1_OUT 0x01    //wMaxPacketSize:   64        Bulk

  7. int USBScanDevice(int usb_pid,int usb_vid);
  8. bool USBOpenDevice(int DevIndex);
  9. bool USBCloseDevice(int DevIndex);
  10. bool USBCheckDevice(int DevIndex);

  11. bool USBBulkWriteData(int DevIndex,int pipenum,char *sendbuffer,int len,int waittime);
  12. int USBBulkReadData(int DevIndex,int pipenum,char *readbuffer,int len,int waittime);
  13. bool USBIntWriteData(int DevIndex,int pipenum,char *sendbuffer,int len,int waittime);
  14. int USBIntReadData(int DevIndex,int pipenum,char *readbuffer,int len,int waittime);
  15. bool USBCtrlData(int DevIndex,int requesttype,int request,int value, int index, char *bytes, int size,int waittime);

  16. #endif
复制代码


设备扫描打开关闭使用USBScanDevice,USBOpenDevice,USBCloseDevice函数,数据传输使用USBBulkWriteData,USBBulkReadData函数,是不是非常简单!
下面这个是C/C++版本的上层代码:
  1. // USBTransmitTest.cpp : Defines the entry point for the console application.
  2. //

  3. #ifdef OS_UNIX
  4. #include <time.h>
  5. #include <sys/time.h>
  6. #include <unistd.h>
  7. #include <stdlib.h>
  8. #else
  9. #include <Windows.h>
  10. #endif
  11. #include <stdio.h>
  12. #include <memory.h>
  13. #include "USBTransmit.h"

  14. #define USB_VID     0x0483
  15. #define USB_PID     0x5710

  16. int main(int argc, char* argv[])
  17. {
  18.     int DevNum;
  19.     //单位为包
  20.     int DataNum = 500;
  21.     //每次传输的数据字节数,该参数必须和单片机中的参数完全匹配,该参数不能大于或等于64K
  22.     int PacketSize = 32*1024;
  23.     int DataNumIndex = DataNum;
  24.     int ret;
  25.     char *pReadDataBuffer = (char *)malloc(PacketSize);
  26.     char WriteDataBuffer[8];
  27.     //扫描设备连接数,需要初始化
  28.     DevNum = USBScanDevice(USB_PID,USB_VID);
  29.     printf("设备连接数为:%d\n",DevNum);
  30.     //打开设备0
  31.     if(USBOpenDevice(0)){
  32.         printf("打开设备成功!\n");
  33.     }else{
  34.         printf("打开设备失败!\n");
  35.         getchar();
  36.         return 0;
  37.     }
  38.     DataNumIndex = DataNum;
  39.     //告诉设备即将要读取的数据包数
  40.     WriteDataBuffer[0] = DataNum>>24;
  41.     WriteDataBuffer[1] = DataNum>>16;
  42.     WriteDataBuffer[2] = DataNum>>8;
  43.     WriteDataBuffer[3] = DataNum>>0;
  44.     //高速设备每包数据的长度
  45.     WriteDataBuffer[4] = PacketSize>>24;
  46.     WriteDataBuffer[5] = PacketSize>>16;
  47.     WriteDataBuffer[6] = PacketSize>>8;
  48.     WriteDataBuffer[7] = PacketSize>>0;
  49.     ret = USBBulkWriteData(0,EP1_OUT,WriteDataBuffer,8,100);
  50.     if(ret){
  51.         printf("写数据成功!\n");
  52.     }else{
  53.         printf("写数据失败!\n");
  54.         getchar();
  55.     }
  56.     printf("正在测试读数据速度,请稍候...\n");
  57.     //获取起始时间
  58. #ifdef OS_UNIX
  59.     struct timeval StartTime_t,EndTime_t;
  60.     long long  StartTime,EndTime;
  61.     double dfFreq = CLOCKS_PER_SEC;
  62.     gettimeofday(&StartTime_t,NULL);//开始计时
  63. #else
  64.     LARGE_INTEGER litmp;
  65.     LONGLONG StartTime,EndTime;
  66.     double dfFreq;
  67.     QueryPerformanceFrequency(&litmp);//取得高精度运行计数器的频率f,单位是每秒多少次(n/s),
  68.     dfFreq = (double)litmp.QuadPart;
  69.     QueryPerformanceCounter(&litmp);//取得高精度运行计数器的数值
  70.     StartTime = litmp.QuadPart; //开始计时
  71. #endif
  72.     //循环读取数据
  73.     do{
  74.         ret = USBBulkReadData(0,EP1_IN,pReadDataBuffer,PacketSize,100);
  75.         if(ret != PacketSize){
  76.             break;
  77.         }else{
  78.             DataNumIndex--;
  79.         }
  80.     }while(DataNumIndex > 0);
  81.     if(DataNumIndex > 0){
  82.         printf("读数据失败!\n");
  83.         getchar();
  84.     }else{
  85.         printf("读数据成功!\n");
  86.     }
  87.     //获取结束时间并打印输出耗时和速度
  88. #ifdef OS_UNIX
  89.     gettimeofday(&EndTime_t,NULL); //终止计时
  90.     StartTime = StartTime_t.tv_sec*1000000+StartTime_t.tv_usec;
  91.     EndTime = EndTime_t.tv_sec*1000000+EndTime_t.tv_usec;
  92. #else
  93.     QueryPerformanceCounter(&litmp);//取得高精度运行计数器的数值
  94.     EndTime = litmp.QuadPart; //终止计时
  95. #endif
  96.     //打印输出读数据速度
  97.     printf("-----------------------[url=http://www.embed-net.com]www.embed-net.com[/url]-----------------------\n");
  98.     printf("读数据字节数: %d MBytes\n",(DataNum-DataNumIndex)*PacketSize/(1024*1024));
  99.     printf("读数据消耗时间: %f s\n",(EndTime-StartTime)/dfFreq);
  100.     printf("读数据速度: %.3f MByte/s\n",(DataNum-DataNumIndex)*PacketSize/((EndTime-StartTime)/dfFreq)/(1024*1024));
  101.     printf("-----------------------[url=http://www.embed-net.com]www.embed-net.com[/url]-----------------------\n");
  102.     //释放动态分配的内存空间
  103.     free(pReadDataBuffer);
  104.     //关闭设备0
  105.     ret = USBCloseDevice(0);
  106.     if(ret){
  107.         printf("关闭设备成功!\n");
  108.     }else{
  109.         printf("关闭设备失败!\n");
  110.     }
  111.     getchar();
  112.     return 0;
  113. }
复制代码


源码下载:
http://www.embed-net.com/thread-579-1-1.html

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2016-6-6 12:21:35 | 显示全部楼层
收藏一个,感谢分享

出0入0汤圆

发表于 2016-6-6 12:30:21 | 显示全部楼层
需要金币

出0入0汤圆

发表于 2016-6-6 15:34:39 | 显示全部楼层
感觉搞USB的都是很NB的。

出0入0汤圆

发表于 2016-6-6 15:57:22 | 显示全部楼层
有点疑问,如果是USB_FS,  按照USB规范,一秒1000次,每次最大1023字节,  那么应该最高速是1.023M字节       这里是1.098了

出0入0汤圆

 楼主| 发表于 2016-6-6 16:54:00 | 显示全部楼层
huangqi412 发表于 2016-6-6 15:57
有点疑问,如果是USB_FS,  按照USB规范,一秒1000次,每次最大1023字节,  那么应该最高速是1.023M字节     ...

不知道你这个是个什么算法

出0入0汤圆

发表于 2016-6-6 17:32:25 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2016-6-6 17:35:51 | 显示全部楼层
学习了,多谢

出0入0汤圆

发表于 2016-6-6 17:41:50 来自手机 | 显示全部楼层
能上传论坛不?

出0入0汤圆

发表于 2016-6-6 17:46:03 | 显示全部楼层
期待上传到论坛,学习下

出0入0汤圆

发表于 2016-6-6 17:48:27 | 显示全部楼层
源码能否传到这来?下载方便点

出0入0汤圆

发表于 2016-6-6 18:07:27 来自手机 | 显示全部楼层
好东西,就是希望分享过来,下载不了

出0入0汤圆

发表于 2016-6-6 18:16:31 | 显示全部楼层
huangqi412 发表于 2016-6-6 15:57
有点疑问,如果是USB_FS,  按照USB规范,一秒1000次,每次最大1023字节,  那么应该最高速是1.023M字节     ...

USB_FS,一次最多不是64字节么。

出0入17汤圆

发表于 2016-6-6 18:17:19 来自手机 | 显示全部楼层
强,默默的赞一个

出0入0汤圆

发表于 2016-6-6 18:30:57 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2016-6-6 18:32:30 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2016-6-6 19:27:21 | 显示全部楼层
好东西,当然需要付出点代价
我调试程序也不容易啊

出0入0汤圆

发表于 2016-6-6 19:53:53 | 显示全部楼层
支持楼主

出0入0汤圆

发表于 2016-6-6 19:57:43 | 显示全部楼层
楼主牛X!非常强悍,非常感谢!

出0入0汤圆

发表于 2016-6-6 20:05:24 | 显示全部楼层
200金币,希望在楼主的坛里发水帖不要被封号啊》
我正努力回帖升级中。。。
估计也要发到手抽筋吧

出0入0汤圆

发表于 2016-6-6 22:42:59 来自手机 | 显示全部楼层
sblpp 发表于 2016-6-6 20:05
200金币,希望在楼主的坛里发水帖不要被封号啊》
我正努力回帖升级中。。。
估计也要发到手抽筋吧 ...

等你好消息了

出0入0汤圆

发表于 2016-6-6 22:53:16 | 显示全部楼层
这么高大上的资料,楼主厉害

出0入0汤圆

发表于 2016-6-6 23:01:32 来自手机 | 显示全部楼层
收藏,有备无患
头像被屏蔽

出0入0汤圆

发表于 2016-6-7 00:17:13 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2016-12-2 17:04:31 | 显示全部楼层
收藏一个,感谢分享

出0入0汤圆

发表于 2016-12-2 18:21:29 | 显示全部楼层
最近要做STM32和A20的USB通信,楼主的这个正好用得上。已经在楼主网址花20块钱买好了源码;需要的去买吧,20块钱也不贵;就不传播了

出0入0汤圆

发表于 2016-12-2 19:23:37 | 显示全部楼层
好东西,也不贵。需要的时候,能省很多时间。支持。

出0入0汤圆

发表于 2016-12-2 19:57:08 | 显示全部楼层
1M 2.0全速要榨干...

出0入0汤圆

发表于 2016-12-2 21:24:36 | 显示全部楼层
大哥,搬一个过来嘛,那儿买不起啊。。。

出0入0汤圆

 楼主| 发表于 2016-12-3 09:59:43 | 显示全部楼层
honami520 发表于 2016-12-2 18:21
最近要做STM32和A20的USB通信,楼主的这个正好用得上。已经在楼主网址花20块钱买好了源码;需要的去买吧,2 ...

感谢支持!这些对于需要的人来说,我想可以节约很多时间,若能节约一天的时间,我想价值再怎么也不止20是吧
收点小钱,作为维护论坛的费用,没指望靠这个赚钱的,相信大家也能理解
头像被屏蔽

出0入0汤圆

发表于 2016-12-3 10:23:01 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
头像被屏蔽

出0入0汤圆

发表于 2016-12-3 10:24:20 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

 楼主| 发表于 2016-12-3 12:22:47 | 显示全部楼层
bbs2009 发表于 2016-12-3 10:23
20 元 真的不多。 给一个打字员 20 元 钱 , 都未必能 把代码输入完成!

顶LZ !

感谢理解!

出0入0汤圆

发表于 2016-12-3 16:59:40 | 显示全部楼层
有人在产品中用了吗?

出0入0汤圆

发表于 2016-12-3 17:40:02 | 显示全部楼层
用SDIO WiFi也可以 Marvell8801

出0入0汤圆

发表于 2016-12-14 09:54:42 | 显示全部楼层
学习下,收藏了

出0入0汤圆

发表于 2017-1-7 15:50:52 | 显示全部楼层
太好了,

出0入0汤圆

发表于 2017-2-7 22:56:46 | 显示全部楼层
支持一下。。。。。

出0入0汤圆

发表于 2017-2-8 14:48:07 | 显示全部楼层
记号记号,要用来找

出0入0汤圆

发表于 2017-2-9 02:08:23 | 显示全部楼层
谢谢分享!!

出0入0汤圆

发表于 2017-2-13 16:04:20 | 显示全部楼层
记录一下,用得着时再来买

出0入0汤圆

发表于 2017-2-13 22:20:52 | 显示全部楼层
收藏一个,感谢分享

出0入0汤圆

发表于 2017-3-23 17:13:25 | 显示全部楼层
请问自定义USB数据传输才1MBye, 与 高速传输、全速传输有何区别?

出0入0汤圆

发表于 2017-3-23 17:14:35 | 显示全部楼层
bbs2009 发表于 2016-6-7 00:17
2,PC端驱动支持Windows,Linux,Mac,Android,树莓派,除了安卓之外,其他的代码为同一套代码,
只需要在不 ...

能否共享一下源码?谢谢

出0入0汤圆

发表于 2017-3-23 21:59:04 | 显示全部楼层
协议栈自己写的!膜拜

出0入0汤圆

发表于 2017-3-24 01:47:47 来自手机 | 显示全部楼层
既然是bulk传球,为什么每帧限定64bytes?

出0入0汤圆

发表于 2017-3-24 01:48:04 来自手机 | 显示全部楼层
既然是bulk传输,为什么每帧限定64bytes?

出0入0汤圆

 楼主| 发表于 2017-3-27 11:29:56 | 显示全部楼层
wx-ta 发表于 2017-3-24 01:48
既然是bulk传输,为什么每帧限定64bytes?

USB协议就是这样定的,高速USB端点大小可达512,全速USB只有64

出0入0汤圆

发表于 2017-3-28 12:54:19 | 显示全部楼层
wdluo 发表于 2017-3-27 11:29
USB协议就是这样定的,高速USB端点大小可达512,全速USB只有64

你用的F4,我以为你用的它的高速USB

出0入0汤圆

 楼主| 发表于 2017-3-28 14:17:05 | 显示全部楼层
wx-ta 发表于 2017-3-28 12:54
你用的F4,我以为你用的它的高速USB

我有高速传输方案,需要可以加我,188298598

出0入0汤圆

发表于 2017-6-26 06:43:56 | 显示全部楼层
源码下载:
http://www.embed-net.com/thread-579-1-1.html  楼主你好,这个网页无法访问,请问哪位下载了你,能不能给个其他网址?

出0入0汤圆

发表于 2017-6-26 06:57:54 | 显示全部楼层
你的淘宝店的地址是?

出0入0汤圆

发表于 2017-6-26 08:15:04 来自手机 | 显示全部楼层
全速usb自定义传输,不错,谢谢分享

出0入0汤圆

发表于 2017-6-26 08:48:41 | 显示全部楼层
谢谢分享
留个记号

出0入0汤圆

发表于 2017-6-26 08:49:47 | 显示全部楼层
东西不错,楼主牛的

出0入0汤圆

发表于 2017-6-26 10:53:34 | 显示全部楼层
收藏下,谢谢分享

出0入0汤圆

发表于 2017-7-4 11:48:09 | 显示全部楼层
感谢分享,值得学习~~~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 -- 东莞阿莫电子网站 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2022-10-2 17:46

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表