你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

usb vcp host端,不能被动接收数据

[复制链接]
Tonny Ho 提问时间:2022-8-17 12:19 / 未解决
请教一下
我们需要用f4xx做usb vcp host端,
用cubeide生成了usb host端的 virtual com port代码工程,能够正常识别插入的vcp设备,
但是发现usb vcp device端发的数据,host不会主动收,
需要host端定时调用receive的函数才能收到,请问有没有办法让host端不轮询读呢?像串口中断接收那样,不是很懂usb cdc,请各位大佬帮帮忙

收藏 评论12 发布时间:2022-8-17 12:19

举报

12个回答
xmshao 回答时间:2022-8-17 13:11:08
USB通信基于主从结构,所有的通信传输都是由HOST发起的。即使从设备要向主发数据,也得等主发读取命令才可以,否则HOST就没法正常接收来自从设备的数据的。所以你的代码也得按这个机制来安排。
Tonny Ho 回答时间:2022-8-17 13:46:21
xmshao 发表于 2022-8-17 13:11
USB通信基于主从结构,所有的通信传输都是由HOST发起的。即使从设备要向主发数据,也得等主发读取命令才可 ...

谢谢
我也试过主动发起接收,但是不知道应该在哪里加这个机制好点
还有一个问题,主机并不提前知道设备端发过来的字节数,主动请求多少数据呢?
是否cdc 的vcp类已经有相关的机制,求指导
xmshao 回答时间:2022-8-17 16:18:55
Tonny Ho 发表于 2022-8-17 13:46
谢谢
我也试过主动发起接收,但是不知道应该在哪里加这个机制好点
还有一个问题,主机并不提前知道设备 ...


你要看看相应协议。

HOST找device要数据,device有就给,没有就先拒绝。HOST会不停找你要的,至于你给多少数据过去,它会数据包的情况来判断,比方收到一包不满的数据或零数据包它就视为此次传输结束。
yklstudent 回答时间:2022-8-18 08:29:07
mark,签到+1
废鱼 回答时间:2022-8-18 08:35:51
我用的是标准库,在以下代码中添加,我不确定HAL库中是如何操作的。我生成一个试试。
static uint16_t VCP_DataRx (uint8_t epnum,uint8_t* Buf, uint32_t Len)
{
        switch(epnum+0x80)
        {
                case CDC_IN_EP1:
                        USART_rx(Buf, Len);
                        break;
                default:
                        break;
        }
  return USBD_OK;
}

废鱼 回答时间:2022-8-18 08:50:11
你看一下这个函数:USBH_CDC_ReceiveCallback
Tonny Ho 回答时间:2022-8-18 09:29:41
xmshao 发表于 2022-8-17 16:18
你要看看相应协议。

HOST找device要数据,device有就给,没有就先拒绝。HOST会不停找你要的,至于你给多 ...

我们在sof中每1ms向从机请求一次从机数据,
但主机并不会提前知道从机每一个包会发多少数据过来,
我这个USBH_CDC_Receive函数应该指定多少的长度?
USBH_StatusTypeDef  USBH_CDC_Receive(USBH_HandleTypeDef *phost,
                                     uint8_t *pbuff,
                                     uint32_t length);


还有另外一个问题,为什么PC端的vcp主机(窗口调试助手)没有定时轮询从机(用Bus Hound抓数据观察),但也能像串口中断那样收到从机的数据??请指导

Tonny Ho 回答时间:2022-8-18 09:33:51
废鱼 发表于 2022-8-18 08:50
你看一下这个函数:USBH_CDC_ReceiveCallback

这个要先主动轮询从机,从机回复数据之后才会进callback,

主机不轮询从机的话,尽管从机不断往上发数据,主机也不会进这个callback

不知道有没有相关的host vcp例程参考
Tonny Ho 回答时间:2022-8-18 10:19:00
Tonny Ho 发表于 2022-8-17 13:46
谢谢
我也试过主动发起接收,但是不知道应该在哪里加这个机制好点
还有一个问题,主机并不提前知道设备 ...

现在在这里每1ms,向从设备请求一次数据
/**
  * @brief  SOF callback.
  * @param  hhcd: HCD handle
  * @retval None
  */
void HAL_HCD_SOF_Callback(HCD_HandleTypeDef *hhcd)
{
        USBH_LL_IncTimer(hhcd->pData);


        USBH_CDC_Receive(&hUsbHostFS, USBHTxBuf, 64);
}



但是请求数据的长度改如何合适?主机提前不会知道从机会发多少数据
USBH_StatusTypeDef  USBH_CDC_Receive(USBH_HandleTypeDef *phost,
                                     uint8_t *pbuff,
                                     uint32_t length);



另外,pc端的host 窗口调试助手好像没有主动轮询设备也能及时收到从机主动发的数据(用Bus Hound抓取没看到轮询的包),为什么呢?是不是CDC vcp类有什么机制可以做到这样?


Tonny Ho 回答时间:2022-8-18 10:21:40
废鱼 发表于 2022-8-18 08:35
我用的是标准库,在以下代码中添加,我不确定HAL库中是如何操作的。我生成一个试试。
static uint16_t VCP_ ...

请问您这个代码在哪添加?系统如何通知调用到这里的?
废鱼 回答时间:2022-8-19 13:35:57
Tonny Ho 发表于 2022-8-18 10:21
请问您这个代码在哪添加?系统如何通知调用到这里的?

我这个是标准库下的操作。我这个操作和中断差不多,是自己调用的,不需要我进行操作。
废鱼 回答时间:2022-8-19 14:13:12
你试试USBH_CDC_Receive这个函数。

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版