完善资料让更多小伙伴认识你,还能领取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; } |
|
|
|
只有小组成员才能发言,加入小组>>
3314 浏览 9 评论
2995 浏览 16 评论
3494 浏览 1 评论
9059 浏览 16 评论
4088 浏览 18 评论
1178浏览 3评论
605浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
599浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2335浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1896浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 06:28 , Processed in 1.022930 second(s), Total 78, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号