完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
现在STM32库是有个TXState用来表示是否发送完毕,比如:
hcdc->TxState=1; USBD_LL_Transmit(...) while(hcdc->TxState==0); 在USB的DataIN函数里, static uint8_t USBD_CDC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) { USBD_CDC_HandleTypeDef *hcdc; PCD_HandleTypeDef *hpcd = pdev->pData; if (pdev->pClassData == NULL) { return (uint8_t)USBD_FAIL; } hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassData; if ((pdev->ep_in[epnum].total_length > 0U) && ((pdev->ep_in[epnum].total_length % hpcd->IN_ep[epnum].maxpacket) == 0U)) { /* Update the packet total length */ pdev->ep_in[epnum].total_length = 0U; /* Send ZLP */ (void)USBD_LL_Transmit(pdev, epnum, NULL, 0U); } else { hcdc->TxState = 0U; ((USBD_CDC_ItfTypeDef *)pdev->pUserData)->TransmitCplt(hcdc->TxBuffer, &hcdc->TxLength, epnum); } return (uint8_t)USBD_OK; } 可以看到为我们处理了整数倍发送需要在补0字节的一个包的特殊情况: 我这里使用了操作系统,也就是说一个信号量代替了TXState,然后在else { hcdc->TxState = 0U; ((USBD_CDC_ItfTypeDef *)pdev->pUserData)->TransmitCplt(hcdc->TxBuffer, &hcdc->TxLength, epnum); }将hcdc->TxState = 0U;改成了xSemaphoreGiveFromISR(...)为的是不要死等。 然后单片机发送256字节,结果上位机只能收到一次或者收不到, 我研究了下库,最终我自己处理整数倍发送的问题,不用STM32官方库处理了。代码改成如下所示就好了: static uint8_t USBD_CDC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) { USBD_CDC_HandleTypeDef *hcdc; PCD_HandleTypeDef *hpcd = pdev->pData; xSemaphoreGiveFromISR(....) return (uint8_t)USBD_OK; } ... uint8_t CDC_Transmit_FS(uint8_t* Buf, uint32_t Len) { 复位信号量; 发你的数据; 等待信号量; if(Len%64==0)//注意 我实测,哪怕是高速USB,这里我之前以为应该是和512取余数,但实测不行 必须是64 { 复位信号量; 发0长度数据; 等待信号量; } /* USER CODE END 7 */ return result; } |
|
|
|
|
只有小组成员才能发言,加入小组>>
1599 浏览 0 评论
imx6ull 和 lan8742 工作起来不正常, ping 老是丢包
4738 浏览 0 评论
4229 浏览 9 评论
3822 浏览 16 评论
4398 浏览 1 评论
4210浏览 3评论
2379浏览 0评论
3393浏览 0评论
1158浏览 0评论
2843浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 19:49 , Processed in 1.612722 second(s), Total 74, Slave 54 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2784