打印

请教一个usb问题

[复制链接]
4733|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
打算用按键来切换usb模式,不知道可不可行,比如检测到按键按下时为usb u盘模式,反之为usb 转串口模式
想想整合,在程序运行时不可以用#if #endif,遇到结构体初始化时用if来选择还是不行,大家有没什么好办法?
沙发
IJK| | 2013-5-13 10:40 | 只看该作者
可以。但如果不熟悉USB,应该有些困难。

使用特权

评论回复
板凳
清风致影| | 2013-5-13 10:48 | 只看该作者
嘿嘿 终于碰到一个和我想法一样的人
不过楼主为什么不把这两个功能做在一起?做成复合设备?

使用特权

评论回复
地板
gurong60|  楼主 | 2013-5-13 11:17 | 只看该作者
今天试着改改,改出一堆错误

使用特权

评论回复
5
gurong60|  楼主 | 2013-5-13 11:18 | 只看该作者
清风致影 发表于 2013-5-13 10:48
嘿嘿 终于碰到一个和我想法一样的人
不过楼主为什么不把这两个功能做在一起?做成复合设备? ...

我倒想,但我只要在按键的状况下实现即可

使用特权

评论回复
6
gurong60|  楼主 | 2013-5-13 11:24 | 只看该作者
现在看到主函数里面是一样的



不一样的是在






















使用特权

评论回复
7
gurong60|  楼主 | 2013-5-13 11:25 | 只看该作者
这是串口的
DEVICE_PROP Device_Property =
  {
    Virtual_Com_Port_init,
    Virtual_Com_Port_Reset,
    Virtual_Com_Port_Status_In,
    Virtual_Com_Port_Status_Out,
    Virtual_Com_Port_Data_Setup,
    Virtual_Com_Port_NoData_Setup,
    Virtual_Com_Port_Get_Interface_Setting,
    Virtual_Com_Port_GetDeviceDescriptor,
    Virtual_Com_Port_GetConfigDescriptor,
    Virtual_Com_Port_GetStringDescriptor,
    0,
    0x40 /*MAX PACKET SIZE*/
  };

USER_STANDARD_REQUESTS User_Standard_Requests =
  {
    Virtual_Com_Port_GetConfiguration,
    Virtual_Com_Port_SetConfiguration,
    Virtual_Com_Port_GetInterface,
    Virtual_Com_Port_SetInterface,
    Virtual_Com_Port_GetStatus,
    Virtual_Com_Port_ClearFeature,
    Virtual_Com_Port_SetEndPointFeature,
    Virtual_Com_Port_SetDeviceFeature,
    Virtual_Com_Port_SetDeviceAddress
  };

ONE_DESCRIPTOR Device_Descriptor =
  {
    (uint8_t*)Virtual_Com_Port_DeviceDescriptor,
    VIRTUAL_COM_PORT_SIZ_DEVICE_DESC
  };

ONE_DESCRIPTOR Config_Descriptor =
  {
    (uint8_t*)Virtual_Com_Port_ConfigDescriptor,
    VIRTUAL_COM_PORT_SIZ_CONFIG_DESC
  };

ONE_DESCRIPTOR String_Descriptor[4] =
  {
    {(uint8_t*)Virtual_Com_Port_StringLangID, VIRTUAL_COM_PORT_SIZ_STRING_LANGID},
    {(uint8_t*)Virtual_Com_Port_StringVendor, VIRTUAL_COM_PORT_SIZ_STRING_VENDOR},
    {(uint8_t*)Virtual_Com_Port_StringProduct, VIRTUAL_COM_PORT_SIZ_STRING_PRODUCT},
    {(uint8_t*)Virtual_Com_Port_StringSerial, VIRTUAL_COM_PORT_SIZ_STRING_SERIAL}
  };

使用特权

评论回复
8
gurong60|  楼主 | 2013-5-13 11:26 | 只看该作者
这个是u盘的,

                DEVICE_PROP Device_Property =
                {
                        MASS_init,
                        MASS_Reset,
                        MASS_Status_In,
                        MASS_Status_Out,
                        MASS_Data_Setup,
                        MASS_NoData_Setup,
                        MASS_Get_Interface_Setting,
                        MASS_GetDeviceDescriptor,
                        MASS_GetConfigDescriptor,
                        MASS_GetStringDescriptor,
                        0,
                        0x40 /*MAX PACKET SIZE*/
                };
               
                USER_STANDARD_REQUESTS User_Standard_Requests =
                {
                        Mass_Storage_GetConfiguration,
                        Mass_Storage_SetConfiguration,
                        Mass_Storage_GetInterface,
                        Mass_Storage_SetInterface,
                        Mass_Storage_GetStatus,
                        Mass_Storage_ClearFeature,
                        Mass_Storage_SetEndPointFeature,
                        Mass_Storage_SetDeviceFeature,
                        Mass_Storage_SetDeviceAddress
                };
               
                ONE_DESCRIPTOR Device_Descriptor =
                {
                        (uint8_t*)MASS_DeviceDescriptor,
                        MASS_SIZ_DEVICE_DESC
                };
               
                ONE_DESCRIPTOR Config_Descriptor =
                {
                        (uint8_t*)MASS_ConfigDescriptor,
                        MASS_SIZ_CONFIG_DESC
                };
               
                ONE_DESCRIPTOR String_Descriptor[5] =
                {
                        {(uint8_t*)MASS_StringLangID, MASS_SIZ_STRING_LANGID},
                        {(uint8_t*)MASS_StringVendor, MASS_SIZ_STRING_VENDOR},
                        {(uint8_t*)MASS_StringProduct, MASS_SIZ_STRING_PRODUCT},
                        {(uint8_t*)MASS_StringSerial, MASS_SIZ_STRING_SERIAL},
                        {(uint8_t*)MASS_StringInterface, MASS_SIZ_STRING_INTERFACE},
                };

使用特权

评论回复
9
gurong60|  楼主 | 2013-5-13 11:27 | 只看该作者
重复定义了,如果用if来选择,会出错,为什么这样选择不行呢

使用特权

评论回复
10
gurong60|  楼主 | 2013-5-13 12:44 | 只看该作者
顶起

使用特权

评论回复
11
lcdi| | 2013-5-13 13:06 | 只看该作者
难度还是挺大的,我也正想把串口和u盘做到一起,正在学习。

使用特权

评论回复
12
PIGYONG801| | 2013-5-13 13:46 | 只看该作者
描述要好好写一下,端点分开就容易

使用特权

评论回复
13
gurong60|  楼主 | 2013-5-13 13:50 | 只看该作者
/*                DEVICE_PROP Device_Property =
                {
                        MASS_init,
                        MASS_Reset,
                        MASS_Status_In,
                        MASS_Status_Out,
                        MASS_Data_Setup,
                        MASS_NoData_Setup,
                        MASS_Get_Interface_Setting,
                        MASS_GetDeviceDescriptor,
                        MASS_GetConfigDescriptor,
                        MASS_GetStringDescriptor,
                        0,
                        0x40 //MAX PACKET SIZE
                };
               
                USER_STANDARD_REQUESTS User_Standard_Requests =
                {
                        Mass_Storage_GetConfiguration,
                        Mass_Storage_SetConfiguration,
                        Mass_Storage_GetInterface,
                        Mass_Storage_SetInterface,
                        Mass_Storage_GetStatus,
                        Mass_Storage_ClearFeature,
                        Mass_Storage_SetEndPointFeature,
                        Mass_Storage_SetDeviceFeature,
                        Mass_Storage_SetDeviceAddress
                };
               
                ONE_DESCRIPTOR Device_Descriptor =
                {
                        (uint8_t*)MASS_DeviceDescriptor,
                        MASS_SIZ_DEVICE_DESC
                };
               
                ONE_DESCRIPTOR Config_Descriptor =
                {
                        (uint8_t*)MASS_ConfigDescriptor,
                        MASS_SIZ_CONFIG_DESC
                };
               
                ONE_DESCRIPTOR String_Descriptor[5] =
                {
                        {(uint8_t*)MASS_StringLangID, MASS_SIZ_STRING_LANGID},
                        {(uint8_t*)MASS_StringVendor, MASS_SIZ_STRING_VENDOR},
                        {(uint8_t*)MASS_StringProduct, MASS_SIZ_STRING_PRODUCT},
                        {(uint8_t*)MASS_StringSerial, MASS_SIZ_STRING_SERIAL},
                        {(uint8_t*)MASS_StringInterface, MASS_SIZ_STRING_INTERFACE},
                };


           */








                LINE_CODING linecoding =
                {
                        115200, /* baud rate*/
                        0x00,   /* stop bits-1*/
                        0x00,   /* parity - none*/
                        0x08    /* no. of bits 8*/
                };
               
                /* -------------------------------------------------------------------------- */
                /*  Structures initializations */
                /* -------------------------------------------------------------------------- */
               
       
               
                DEVICE_PROP Device_Property =
                {
                        Virtual_Com_Port_init,
                        Virtual_Com_Port_Reset,
                        Virtual_Com_Port_Status_In,
                        Virtual_Com_Port_Status_Out,
                        Virtual_Com_Port_Data_Setup,
                        Virtual_Com_Port_NoData_Setup,
                        Virtual_Com_Port_Get_Interface_Setting,
                        Virtual_Com_Port_GetDeviceDescriptor,
                        Virtual_Com_Port_GetConfigDescriptor,
                        Virtual_Com_Port_GetStringDescriptor,
                        0,
                        0x40 /*MAX PACKET SIZE*/
                };
               
                USER_STANDARD_REQUESTS User_Standard_Requests =
                {
                        Virtual_Com_Port_GetConfiguration,
                        Virtual_Com_Port_SetConfiguration,
                        Virtual_Com_Port_GetInterface,
                        Virtual_Com_Port_SetInterface,
                        Virtual_Com_Port_GetStatus,
                        Virtual_Com_Port_ClearFeature,
                        Virtual_Com_Port_SetEndPointFeature,
                        Virtual_Com_Port_SetDeviceFeature,
                        Virtual_Com_Port_SetDeviceAddress
                };
               
                ONE_DESCRIPTOR Device_Descriptor =
                {
                        (uint8_t*)Virtual_Com_Port_DeviceDescriptor,
                        VIRTUAL_COM_PORT_SIZ_DEVICE_DESC
                };
               
                ONE_DESCRIPTOR Config_Descriptor =
                {
                        (uint8_t*)Virtual_Com_Port_ConfigDescriptor,
                        VIRTUAL_COM_PORT_SIZ_CONFIG_DESC
                };
               
                ONE_DESCRIPTOR String_Descriptor[4] =
                {
                        {(uint8_t*)Virtual_Com_Port_StringLangID, VIRTUAL_COM_PORT_SIZ_STRING_LANGID},
                        {(uint8_t*)Virtual_Com_Port_StringVendor, VIRTUAL_COM_PORT_SIZ_STRING_VENDOR},
                        {(uint8_t*)Virtual_Com_Port_StringProduct, VIRTUAL_COM_PORT_SIZ_STRING_PRODUCT},
                        {(uint8_t*)Virtual_Com_Port_StringSerial, VIRTUAL_COM_PORT_SIZ_STRING_SERIAL}
                };

屏蔽红字部分,启动时为串口,如果屏蔽下面,则为u盘,请问如果对这俩段进行选择?

使用特权

评论回复
14
lxyppc| | 2013-5-13 13:52 | 只看该作者
看来楼主对USB协议还很不了解
勿在浮沙筑高台
知其然并知其所以然才能做好东西
楼主还是先看看USB的一些基本概念,以及C语言的一些基础知识吧

使用特权

评论回复
15
gurong60|  楼主 | 2013-5-13 20:08 | 只看该作者
lxyppc 发表于 2013-5-13 13:52
看来楼主对USB协议还很不了解
勿在浮沙筑高台
知其然并知其所以然才能做好东西

版主教训的是,问题已经解决,我重新定义一套数据结构

使用特权

评论回复
16
gurong60|  楼主 | 2013-5-13 20:09 | 只看该作者
Simon21ic 发表于 2013-5-13 14:57
很简单,几分钟就能搞定,关键问题在于ST的USB协议栈太糟糕,ST提供的代码,最多只是一个demo,并不能算是 ...

很牛x,这是复用 吧,很好,留着以后用

使用特权

评论回复
17
Simon21ic| | 2013-5-13 20:19 | 只看该作者
gurong60 发表于 2013-5-13 20:09
很牛x,这是复用 吧,很好,留着以后用

这个是标准协议栈,设备的定义数据和USB协议栈代码分离,一般来说,如果是标准设备的话,用户不用写代码,设置一些数据结构就可以了,基本不用写什么代码。

使用特权

评论回复
18
lackmy| | 2013-5-13 20:32 | 只看该作者
初学者~~膜拜膜拜~~~~~

使用特权

评论回复
19
gurong60|  楼主 | 2013-5-13 20:33 | 只看该作者
我去补基础去

使用特权

评论回复
20
lzqxs89| | 2013-5-14 09:57 | 只看该作者
lxyppc 发表于 2013-5-13 13:52
看来楼主对USB协议还很不了解
勿在浮沙筑高台
知其然并知其所以然才能做好东西

USB接口应用感觉比较多,但是看到招聘单片机开发的要求会USB协议的不多。 这是个什么情况啊?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:对手,队友

179

主题

1307

帖子

4

粉丝