硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4383|回复: 5
收起左侧

[有问必答] stm32l4 usb CDC 发送数据多了丢包

[复制链接]

5

主题

20

回帖

35

积分

新手上路

积分
35
发表于 2021-7-23 11:35:59 | 显示全部楼层 |阅读模式
下位机使用stm官方的USB cdc device hal库,一直连续向上位机发送数据(每次2KB),上位机调用的是windows自带的串口接口函数(无等待,每2K立即读出),连续发送几十K后就会丢失一些数据,然后在下位机每次发送时增加800us以上的延时,上位机接收就能全部接收正确,大神分析下是哪儿的问题还是虚拟串口发送快了都会有丢包,发送程序如下:
uint8_t USBCom_SendBufNow(uint8_t *Buf, uint16_t Len)
{
        uint32_t len;
        uint32_t uiStartTime;       
        uint16_t i;
       uint8_t re;

        //USB未连接
        if (false == USB_DevConnecteState())
        {
                return USBD_FAIL;
        }

        /*发送缓冲区最大长度的数据*/
       len = sizeof(UserTxBufferFS);
       for (i = 0; i < Len / len; i++)
      {                       
         memcpy(UserTxBufferFS, Buf, len);
        USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, len);
               
        uiStartTime = bsp_GetRunTime();
        while (1)
        {
            re = USBD_CDC_TransmitPacket(&hUsbDeviceFS);        
            if (re == USBD_OK)
            {
                break;
            }
            else if (re == USBD_BUSY)
            {
                if (bsp_CheckRunTime(uiStartTime) >= USB_TIME_OUT)
                                {                                               
                                        BSP_Printf("USB part 1 Data Send busy timeout !\r\n");
                                        break;
                                }
                                else
                                {
                                        continue;
                                }
            }
            else if (re == USBD_FAIL)
            {
                break;
            }
        }

        Buf += len;
    }

        /*发送剩余部分*/
    len = Len % len;
    if (len > 0)
    {
        memcpy(UserTxBufferFS, Buf, len);
        USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, len);

                uiStartTime = bsp_GetRunTime();
        while (1)
        {
            re = USBD_CDC_TransmitPacket(&hUsbDeviceFS);        
            if (re == USBD_OK)
            {
                break;
            }
            else if (re == USBD_BUSY)
            {
                if(bsp_CheckRunTime(uiStartTime) >= USB_TIME_OUT)
                                {                                               
                                        BSP_Printf("USB last part Data Send busy timeout!\r\n");
                                        break;
                                }
                                else
                                {
                                        continue;
                                }
            }
            else if (re == USBD_FAIL)
            {
                break;
            }
        }        
    }

        return re;
}


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
发表于 2021-7-23 16:07:15 | 显示全部楼层
和上位机通信的话,做个应答式的好点。
回复

使用道具 举报

5

主题

20

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2021-7-23 16:27:59 | 显示全部楼层
eric2013 发表于 2021-7-23 16:07
和上位机通信的话,做个应答式的好点。

是应答式的,只是这个指令应答的数据比较多
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
发表于 2021-7-23 18:31:22 | 显示全部楼层
rnjack 发表于 2021-7-23 16:27
是应答式的,只是这个指令应答的数据比较多

那有必要优化下程序了。

应答式算比较靠谱的方式了。
回复

使用道具 举报

32

主题

262

回帖

363

积分

高级会员

积分
363
发表于 2021-8-3 08:59:21 | 显示全部楼层
电脑是有缓存机制的,不是实时处理的
1、增加上位机串口编程的缓存大小
2、增加发包间隔
回复

使用道具 举报

4

主题

24

回帖

36

积分

新手上路

积分
36
发表于 2022-8-22 19:17:24 | 显示全部楼层
楼主你好,请问最后的问题解决了么?我这边测试STM32F407和V7板子都存在这个问题,不延时连续发送USB虚拟串口数据会存在偶尔的丢包问题,而且我这次看到的存在规律,一般第一次丢包之后再发送13包,1包1000字节会数据包开头部分丢失一部分,如果在每次延时后使用HAL_Delay,延时1ms,连续测试几亿个字节没有出现丢包问题。网上搜索似乎确实存在这个问题,我用了2个上位机工具,1个是自己写的串口工具,在UART上连续收发测试ok;另一个是SSCOM,发现收到的数据包确实会存在包头部分丢失数据问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-19 19:31 , Processed in 0.166846 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表