请选择 进入手机版 | 继续访问电脑版
搜索
查看: 3932|回复: 7

[原创] 开源STM32F4xx自定义USB数据传输,支持Windows,Linux,Android,速...

[复制链接]

该用户从未签到

3

主题

1018

帖子

28

蝴蝶豆

论坛元老

最后登录
2023-1-11
发表于 2017-12-26 10:22:19 | 显示全部楼层 |阅读模式
本帖最后由 weiwei4 于 2017-12-26 10:26 编辑

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

部分系统实测图:
1111.png 11112.png 1113.png





代码构成简介:
为方便移植管理,USB底层数据传输封装成了一个名为USBTransmit的库,当然这个库也会提供全部源码,上层应用基于这个库实现USB设备的管理和数据收发即可;
USBTransmit库接口定义如下:
[C] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
#ifndef __USBTRANSMIT_H__
#define __USBTRANSMIT_H__
// Device endpoint(s)
#define EP0     0x00
#define EP1_IN  0x81    //wMaxPacketSize:   64        Bulk
#define EP1_OUT 0x01    //wMaxPacketSize:   64        Bulk
int USBScanDevice(int usb_pid,int usb_vid);
bool USBOpenDevice(int DevIndex);
bool USBCloseDevice(int DevIndex);
bool USBCheckDevice(int DevIndex);
bool USBBulkWriteData(int DevIndex,int pipenum,char *sendbuffer,int len,int waittime);
int USBBulkReadData(int DevIndex,int pipenum,char *readbuffer,int len,int waittime);
bool USBIntWriteData(int DevIndex,int pipenum,char *sendbuffer,int len,int waittime);
int USBIntReadData(int DevIndex,int pipenum,char *readbuffer,int len,int waittime);
bool USBCtrlData(int DevIndex,int requesttype,int request,int value, int index, char *bytes, int size,int waittime);
#endif


设备扫描打开关闭使用USBScanDevice,USBOpenDevice,USBCloseDevice函数,数据传输使用USBBulkWriteData,USBBulkReadData函数,是不是非常简单!


下面这个是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
115
116
// USBTransmitTest.cpp : Defines the entry point for the console application.
//
#ifdef OS_UNIX
#include <time.h>
#include <sys/time.h>
#include <unistd.h>
#include <stdlib.h>
#else
#include <Windows.h>
#endif
#include <stdio.h>
#include <memory.h>
#include "USBTransmit.h"
#define USB_VID     0x0483
#define USB_PID     0x5710
int main(int argc, char* argv[])
{
    int DevNum;
    //单位为包
    int DataNum = 500;
    //每次传输的数据字节数,该参数必须和单片机中的参数完全匹配,该参数不能大于或等于64K
    int PacketSize = 32*1024;
    int DataNumIndex = DataNum;
    int ret;
    char *pReadDataBuffer = (char *)malloc(PacketSize);
    char WriteDataBuffer[8];
    //扫描设备连接数,需要初始化
    DevNum = USBScanDevice(USB_PID,USB_VID);
    printf("设备连接数为:%d\n",DevNum);
    //打开设备0
    if(USBOpenDevice(0)){
        printf("打开设备成功!\n");
    }else{
        printf("打开设备失败!\n");
        getchar();
        return 0;
    }
    DataNumIndex = DataNum;
    //告诉设备即将要读取的数据包数
    WriteDataBuffer[0] = DataNum>>24;
    WriteDataBuffer[1] = DataNum>>16;
    WriteDataBuffer[2] = DataNum>>8;
    WriteDataBuffer[3] = DataNum>>0;
    //高速设备每包数据的长度
    WriteDataBuffer[4] = PacketSize>>24;
    WriteDataBuffer[5] = PacketSize>>16;
    WriteDataBuffer[6] = PacketSize>>8;
    WriteDataBuffer[7] = PacketSize>>0;
    ret = USBBulkWriteData(0,EP1_OUT,WriteDataBuffer,8,100);
    if(ret){
        printf("写数据成功!\n");
    }else{
        printf("写数据失败!\n");
        getchar();
    }
    printf("正在测试读数据速度,请稍候...\n");
    //获取起始时间
#ifdef OS_UNIX
    struct timeval StartTime_t,EndTime_t;
    long long  StartTime,EndTime;
    double dfFreq = CLOCKS_PER_SEC;
    gettimeofday(&StartTime_t,NULL);//开始计时
#else
    LARGE_INTEGER litmp;
    LONGLONG StartTime,EndTime;
    double dfFreq;
    QueryPerformanceFrequency(&litmp);//取得高精度运行计数器的频率f,单位是每秒多少次(n/s),
    dfFreq = (double)litmp.QuadPart;
    QueryPerformanceCounter(&litmp);//取得高精度运行计数器的数值
    StartTime = litmp.QuadPart; //开始计时
#endif
    //循环读取数据
    do{
        ret = USBBulkReadData(0,EP1_IN,pReadDataBuffer,PacketSize,100);
        if(ret != PacketSize){
            break;
        }else{
            DataNumIndex--;
        }
    }while(DataNumIndex > 0);
    if(DataNumIndex > 0){
        printf("读数据失败!\n");
        getchar();
    }else{
        printf("读数据成功!\n");
    }
    //获取结束时间并打印输出耗时和速度
#ifdef OS_UNIX
    gettimeofday(&EndTime_t,NULL); //终止计时
    StartTime = StartTime_t.tv_sec*1000000+StartTime_t.tv_usec;
    EndTime = EndTime_t.tv_sec*1000000+EndTime_t.tv_usec;
#else
    QueryPerformanceCounter(&litmp);//取得高精度运行计数器的数值
    EndTime = litmp.QuadPart; //终止计时
#endif
    //打印输出读数据速度
    printf("-----------------------www.embed-net.com-----------------------\n");
    printf("读数据字节数: %d MBytes\n",(DataNum-DataNumIndex)*PacketSize/(1024*1024));
    printf("读数据消耗时间: %f s\n",(EndTime-StartTime)/dfFreq);
    printf("读数据速度: %.3f MByte/s\n",(DataNum-DataNumIndex)*PacketSize/((EndTime-StartTime)/dfFreq)/(1024*1024));
    printf("-----------------------www.embed-net.com-----------------------\n");
    //释放动态分配的内存空间
    free(pReadDataBuffer);
    //关闭设备0
    ret = USBCloseDevice(0);
    if(ret){
        printf("关闭设备成功!\n");
    }else{
        printf("关闭设备失败!\n");
    }
    getchar();
    return 0;
}


除去程序运行时间统计代码之后,程序是不是非常简单?

源码下载:
重点来了,下面是所有源码下载,当然需要收取一些金币,如何获取金币可以看网站左上角!
当然也可以购买测试开发板,购买后所有源码直接提供,无需再花金币购买,测试开发板购买链接:
https://item.taobao.com/item.htm ... Nt8&id=520834977529

基于STM32F4xx的单片机源码:   firmware.rar (1.09 MB, 下载次数: 230, 售价: 100 金币)
USBTransmit库源码(包含Windows,Linux,Android):   USBTransmit.rar (658.11 KB, 下载次数: 174, 售价: 100 金币)
Windows端需要的驱动程序包:   USBDriver.rar (735.92 KB, 下载次数: 473)
上层测试源码(包含Windows,Linux,Android):   USBTransmitTest.rar (617.03 KB, 下载次数: 548)
回复

使用道具 举报

  • TA的每日心情
    开心
    2017-12-6 11:47
  • 签到天数: 1 天

    [LV.1]初来乍到

    49

    主题

    3724

    帖子

    429

    蝴蝶豆

    论坛元老

    最后登录
    2021-8-7
    发表于 2017-12-26 10:45:52 | 显示全部楼层
    感谢分享,标记一下
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    帖子

    0

    蝴蝶豆

    新手上路

    最后登录
    2018-4-2
    发表于 2018-4-2 04:11:31 | 显示全部楼层
    这个是我需要的
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    83

    帖子

    0

    蝴蝶豆

    高级会员

    最后登录
    2020-10-3
    发表于 2018-8-6 10:24:27 | 显示全部楼层
    要这么多金币
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    50

    帖子

    0

    蝴蝶豆

    高级会员

    最后登录
    2021-4-14
    发表于 2020-9-11 16:10:34 | 显示全部楼层
    感谢分享,标记一下
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    8

    主题

    734

    帖子

    3

    蝴蝶豆

    金牌会员

    最后登录
    2023-5-15
    发表于 2020-9-11 16:47:46 | 显示全部楼层
    已失效
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    2

    帖子

    0

    蝴蝶豆

    新手上路

    最后登录
    2020-11-6
    发表于 2020-11-3 17:32:53 | 显示全部楼层
    链接打不开
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    2

    帖子

    0

    蝴蝶豆

    新手上路

    最后登录
    2020-11-6
    发表于 2020-11-5 18:02:27 | 显示全部楼层
    链接打不开
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

    GMT+8, 2024-3-28 19:22 , Processed in 0.200520 second(s), 40 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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