ch32v208 usb hid 丢包
        while(1)
        {
            if (i==0 && GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10)==0)
            {
                //pressed
                GPIO_WriteBit(GPIOA, GPIO_Pin_9, Bit_RESET);
                i=1;
                Keyboard1_Value[2] = 0x04;
                flag=1;
            }
            else if (i==1 && GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10)==1)
            {
                //release
                GPIO_WriteBit(GPIOA, GPIO_Pin_9, Bit_SET);
                i=0;
                Keyboard1_Value[2] = 0x00;
                flag=1;
            }
            if (USBFS_DevEnumStatus && flag==1)
            {
                USBFS_Endp_DataUp(DEF_UEP1, Keyboard1_Value, sizeof(Keyboard1_Value), DEF_UEP_CPY_LOAD);
                flag=0;
            }
        }


内容不复杂,为了验证有效性把按键动作绑上了一个LED


按下按键,LED点亮,发送0x04;放掉按键,LED熄灭,发送0x00


目前观察LED的明暗没什么问题,但是键盘有个小概率会丢包

这个要如何解决?

你好,USBFS_Endp_DataUp有返回值,返回值是0:表示数据装载成功,返回1:表示上次的数据还没发送出去

image.png


            if (i==0 && GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10)==0)
            {
                //pressed
                GPIO_WriteBit(GPIOA, GPIO_Pin_9, Bit_RESET);
                i=1;
                Keyboard1_Value[2] = 0x04;
                flag=1;
            }
            else if (i==1 && GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10)==1)
            {
                //release
                GPIO_WriteBit(GPIOA, GPIO_Pin_9, Bit_SET);
                i=0;
                Keyboard1_Value[2] = 0x00;
                flag=1;
            }
            if (USBFS_DevEnumStatus)
            {
                if (flag==1)
                {
                    u = USBFS_Endp_DataUp(DEF_UEP1, Keyboard1_Value, sizeof(Keyboard1_Value), DEF_UEP_CPY_LOAD);
                    flag=0;
                }
                if (u==NoREADY)
                {
                    u = USBFS_Endp_DataUp(DEF_UEP1, Keyboard1_Value, sizeof(Keyboard1_Value), DEF_UEP_CPY_LOAD);
                }
            }

按照这个说法我更新了代码

如果返回NoREADY,那么就再传一次

这次观察到延迟的现象 长按按键之后释放 a会持续打出肉眼可见比我手慢一点

USBFS_Endp_DataUp

我感觉这个函数是不是应该优化一下


你好,返回0是数据装载成功,等待主机发IN包,然后上传数据,返回1是指上次的数据还没有发出去

参考这两个博客

https://www.cnblogs.com/wchmcu/p/17508110.html

https://www.cnblogs.com/wchmcu/p/17913838.html


只有登录才能回复,可以选择微信账号登录