OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3149|回复: 2

USB_CDC_HOST:与有4个虚拟串口的复合设备通信的疑问

[复制链接]

12

主题

156

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2555
金钱
2555
注册时间
2017-12-16
在线时间
188 小时
发表于 2023-5-27 13:31:22 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 sfd123 于 2023-5-27 16:32 编辑

MCU是STM32F207,使用ST的标准库;从机是一个虚拟了4个串口的设备目前,通过在函数CDC_InterfaceInit()里手动配置如下:
/* Data Interface */ if((pphost->device_prop.Itf_Desc[1.bInterfaceClass  == DATA_INTERFACE_CLASS_CODE)&& \   
(pphost->device_prop.Itf_Desc[1.bInterfaceSubClass  == RESERVED) && \     
(pphost->device_prop.Itf_Desc[1.bInterfaceProtocol == NO_CLASS_SPECIFIC_PROTOCOL_CODE))
{   
/*Collect the class specific endpoint address and length*/   
CDC_Machine.CDC_DataItf.ep_addr = pphost->device_prop.Ep_Desc[1][0.bEndpointAddress;   
CDC_Machine.CDC_DataItf.length  = pphost->device_prop.Ep_Desc[1][0.wMaxPacketSize;      
if(pphost->device_prop.Ep_Desc[1][0.bEndpointAddress & 0x80)
    {
           CDC_Machine.CDC_DataItf.cdcInEp = (pphost->device_prop.Ep_Desc[1][0.bEndpointAddress);
    }
    else
    {
      CDC_Machine.CDC_DataItf.cdcOutEp = (pphost->device_prop.Ep_Desc[1][0.bEndpointAddress);
    }
       if(pphost->device_prop.Ep_Desc[1][1.bEndpointAddress & 0x80)
    {
      CDC_Machine.CDC_DataItf.cdcInEp = (pphost->device_prop.Ep_Desc[1][1.bEndpointAddress);
   }
   else
    {
     CDC_Machine.CDC_DataItf.cdcOutEp = (pphost->device_prop.Ep_Desc[1][1.bEndpointAddress);
    }
    CDC_Machine.CDC_DataItf.cdcInEp = 0x83;//手动配置
   CDC_Machine.CDC_DataItf.cdcOutEp = 3;//手动配置
       /*Allocate the length for host channel number out*/
   CDC_Machine.CDC_DataItf.hc_num_out = USBH_Alloc_Channel(pdev,  CDC_Machine.CDC_DataItf.cdcOutEp);    /*Allocate the length for host channel number in*/
   CDC_Machine.CDC_DataItf.hc_num_in = USBH_Alloc_Channel(pdev, CDC_Machine.CDC_DataItf.cdcInEp);          /* Open channel for OUT endpoint */
    USBH_Open_Channel  (pdev,  CDC_Machine.CDC_DataItf.hc_num_out,   pphost->device_prop.address, pphost->device_prop.speed, EP_TYPE_BULK,  CDC_Machine.CDC_DataItf.length);      /* Open channel for IN endpoint */          USBH_Open_Channel  (pdev, CDC_Machine.CDC_DataItf.hc_num_in, pphost->device_prop.address,  pphost->device_prop.speed,  EP_TYPE_BULK, CDC_Machine.CDC_DataItf.length);        /*Initilise the Tx/Rx Params*/
    CDC_InitTxRxParam();            /*Initialize the class specific request with "GET_LINE_CODING"*/
   CDC_ReqState = CDC_GET_LINE_CODING_RQUEST ;
通过手动配置,可以与4个串口的任意一个正常收发通信,因为手动配置成一个,所以也只能与其中的一个通信
问题是:如何才能随时、任意与其中一个通信?我尝试改为:

/*Collect the class specific endpoint address and length*/
     CDC_Machine.CDC_DataItf.ep_addr = pphost->device_prop.Ep_Desc[port[0]][0.bEndpointAddress;
   CDC_Machine.CDC_DataItf.length  = pphost->device_prop.Ep_Desc[port[0]][0.wMaxPacketSize;
        for(i=0;i<4;i++)
    {
        if(pphost->device_prop.Ep_Desc[port[i]][0.bEndpointAddress & 0x80)
        {
               CDC_Machine.CDC_DataItf.cdcInEp[i] = (pphost->device_prop.Ep_Desc[port[i]][0.bEndpointAddress);
       }
        else
        {
          CDC_Machine.CDC_DataItf.cdcOutEp[i] = (pphost->device_prop.Ep_Desc[port[i]][0.bEndpointAddress);
        }
               if(pphost->device_prop.Ep_Desc[port[i]][1.bEndpointAddress & 0x80)
        {
         CDC_Machine.CDC_DataItf.cdcInEp[i] = (pphost->device_prop.Ep_Desc[port[i]][1.bEndpointAddress);
        }
        else
        {
         CDC_Machine.CDC_DataItf.cdcOutEp[i = (pphost->device_prop.Ep_Desc[port[i]][1.bEndpointAddress);
        }
                /*Allocate the length for host channel number out*/
       CDC_Machine.CDC_DataItf.hc_num_out = USBH_Alloc_Channel(pdev, CDC_Machine.CDC_DataItf.cdcOutEp[i);        /*Allocate the length for host channel number in*/
        CDC_Machine.CDC_DataItf.hc_num_in = USBH_Alloc_Channel(pdev, CDC_Machine.CDC_DataItf.cdcInEp[i);                  /* Open channel for OUT endpoint */
        USBH_Open_Channel  (pdev, CDC_Machine.CDC_DataItf.hc_num_out, pphost->device_prop.address,pphost->device_prop.speed,EP_TYPE_BULK, CDC_Machine.CDC_DataItf.length);          /* Open channel for IN endpoint */        USBH_Open_Channel  (pdev,  CDC_Machine.CDC_DataItf.hc_num_in,  pphost->device_prop.address, pphost->device_prop.speed, EP_TYPE_BULK, CDC_Machine.CDC_DataItf.length);
   }
    /*Initilise the Tx/Rx Params*/
   CDC_InitTxRxParam();
            /*Initialize the class specific request with "GET_LINE_CODING"*/
   CDC_ReqState = CDC_GET_LINE_CODING_RQUEST ;

在接收和发送函数中 通过改CDC_Machine.CDC_DataItf.hc_num_out和CDC_Machine.CDC_DataItf.hc_num_in进行收发,发现发送正常,但是接收没有数据
麻烦对USB比较清楚的达人指点一下,非常感谢!



最佳答案

查看完整内容[请看2#楼]

我通过一种办法可以实现各个串口通信,但是不知道有没有问题! 暂时这样吧! 这个帖子 先结了吧!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

156

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2555
金钱
2555
注册时间
2017-12-16
在线时间
188 小时
 楼主| 发表于 2023-5-27 13:31:23 | 显示全部楼层
我通过一种办法可以实现各个串口通信,但是不知道有没有问题!
暂时这样吧!

这个帖子 先结了吧!
回复

使用道具 举报

12

主题

156

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2555
金钱
2555
注册时间
2017-12-16
在线时间
188 小时
 楼主| 发表于 2023-5-27 17:09:37 | 显示全部楼层

调试时手动修改

调试时手动修改
图片中是debug时,手动修改的,
初始化是另外一个串口
InPipe  06
OutPipe  05
OutEP  03
InEP    83
可以正常接收和发送

debug时手动改为上图的另外一个串口,主机发送数据,从机接收正常,但是从机发送数据,主机没有接收

请教达人,这里应该怎么处理!非常感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 07:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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