高级会员

- 积分
- 833
- 金钱
- 833
- 注册时间
- 2019-12-17
- 在线时间
- 157 小时
|

楼主 |
发表于 2021-6-10 11:51:55
|
显示全部楼层
本帖最后由 y284858 于 2021-6-10 13:28 编辑
之前仿真会在usb协议里面跑飞,我尝试修改了发送、接收数据处理函数,对缓存读写做了限制之后,目前测试没有跑飞现象。
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
/* USER CODE BEGIN 6 */
void USB_RxCtrl(uint8_t * Buf, uint32_t * Len);
USB_RxCtrl(Buf, Len);
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
return (USBD_OK);
/* USER CODE END 6 */
}
void USB_RxCtrl(uint8_t *Buf, uint32_t *Len)
{
u32 number = 0;
while (number < *Len)
{
USB_RxData[temp.rxlen] = Buf[number];
number++;
temp.rxlen++;
if (temp.rxlen >= USB_RX_BUF_NUMBER)
{
temp.rxlen = 0;
}
}
}
//超时断帧
void HAL_IncTick(void)
{
if (temp.rxlen)
{
static u32 old = 0;
static u8 cnt = 0;
if (old != temp.rxlen)
{
old = temp.rxlen;
cnt = 0;
}
else
{
if (!temp.flag && cnt++ > 1)
{
temp.flag = 1;
}
}
}
uwTick += uwTickFreq;
}
//发送处理
u8 USBSend(u8 *data, u16 len)
{
u16 i = 0;
u8 TimeoutCnt = 0;
uint8_t result = USBD_OK;
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)hUsbDeviceFS.pClassData;
do
{
while (hcdc->TxState != 0)
{
HAL_Delay(1);
if (TimeoutCnt++ > 10)
{ //如果10ms还没有发送完成返回失败
return USBD_BUSY;
}
}
TimeoutCnt = 0;
for (i = 0; i < len && i < APP_TX_DATA_SIZE; i++)
{
UserTxBufferFS[i] = data[i];
}
result = CDC_Transmit_FS(UserTxBufferFS, i);
len -= i;
data += i;
} while (len);
return result;
}
现在变成接受第一包数据之后usb没有再接收到数据,发送数据正常,重启电脑端串口工具后可以再次接收到USB数据。
目前没有发现原因,后续计划将数据处理从超时断帧修改为数据流处理。目前先搁置实现其他功能了。
|
|