久芯网

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

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

12个回答
  • avatar xmshao
    回答时间: 2023-07-20 19:37:01

    USB通信基于主从结构,所有的通信传输都是由HOST发起的。即使从设备要向主发数据,也得等主发读取命令才可以,否则HOST就没法正常接收来自从设备的数据的。所以你的代码也得按这个机制来安排。

  • avatar Tonny Ho
    回答时间: 2023-07-20 20:01:00
    xmshao 发表于 2022-8-17 13:11
    USB通信基于主从结构,所有的通信传输都是由HOST发起的。即使从设备要向主发数据,也得等主发读取命令才可 ...

    谢谢 我也试过主动发起接收,但是不知道应该在哪里加这个机制好点 还有一个问题,主机并不提前知道设备端发过来的字节数,主动请求多少数据呢? 是否cdc 的vcp类已经有相关的机制,求指导

  • avatar xmshao
    回答时间: 2023-07-20 20:24:26
    Tonny Ho 发表于 2022-8-17 13:46
    谢谢 我也试过主动发起接收,但是不知道应该在哪里加这个机制好点 还有一个问题,主机并不提前知道设备 ...

    你要看看相应协议。 HOST找device要数据,device有就给,没有就先拒绝。HOST会不停找你要的,至于你给多少数据过去,它会数据包的情况来判断,比方收到一包不满的数据或零数据包它就视为此次传输结束。

  • avatar yklstudent
    回答时间: 2023-07-20 20:49:09

    mark,签到+1

  • avatar 废鱼
    回答时间: 2023-07-20 21:14:58

    我用的是标准库,在以下代码中添加,我不确定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; }

  • avatar 废鱼
    回答时间: 2023-07-20 21:46:28

    你看一下这个函数:USBH_CDC_ReceiveCallback

  • avatar Tonny Ho
    回答时间: 2023-07-20 22:10:16
    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抓数据观察),但也能像串口中断那样收到从机的数据??请指导

  • avatar Tonny Ho
    回答时间: 2023-07-20 22:37:00
    废鱼 发表于 2022-8-18 08:50
    你看一下这个函数:USBH_CDC_ReceiveCallback

    这个要先主动轮询从机,从机回复数据之后才会进callback, 主机不轮询从机的话,尽管从机不断往上发数据,主机也不会进这个callback 不知道有没有相关的host vcp例程参考

  • avatar Tonny Ho
    回答时间: 2023-07-20 22:57:41
    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类有什么机制可以做到这样?

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

    请问您这个代码在哪添加?系统如何通知调用到这里的?

  • avatar 废鱼
    回答时间: 2023-07-20 23:33:00
    Tonny Ho 发表于 2022-8-18 10:21
    请问您这个代码在哪添加?系统如何通知调用到这里的?

    我这个是标准库下的操作。我这个操作和中断差不多,是自己调用的,不需要我进行操作。

  • avatar 废鱼
    回答时间: 2023-07-21 00:03:02

    你试试USBH_CDC_Receive这个函数。

会员中心 微信客服
客服
回到顶部