ligongxiaobie 发表于 2017-12-16 10:38:24

usb虚拟串口,如何判断数据是否被搬运完毕

附件是从网上下载的,貌似是官方工程师帮助客户解决问题的。
但是只说原因,并没有说如何解决,看了很久自己并没有解决这个问题,所以来这里问问,如何解决。
我现在的解决方法是这样的
uint16_t VCP_DataTx (uint8_t data)
{
        APP_Rx_Buffer=data;        //写入发送buf
//        while(1)
        {
                APP_Rx_ptr_in++;

                if((APP_Rx_ptr_in) ==APP_Rx_ptr_out)
                {
//                        while(1)
//                        {
//                                if(USB_Tx_State==0)
//                                break;
//                        }
                        timet2++;
                        printf("第 %d 次进入2模式\r\n",timet2);
                        delay_ms(10);
                }
                if(APP_Rx_ptr_in==APP_RX_DATA_SIZE)        //超过buf大小了,归零.
                {
                        APP_Rx_ptr_in = 0;
                }
        }

        return USBD_OK;
}我现在的解决办法是当APP_Rx_ptr_in==APP_Rx_ptr_out的时候,加固定延时,之前判断USB_Tx_State实际上也没有解决自己的问题,就用了现在的加延时方法,但是这个是治标不治本。请问如何判断USB把数据搬运出去呢?
查了很久也没有人说这个事。
希望各位能帮忙看一下。

ligongxiaobie 发表于 2017-12-16 11:27:00

赶上周末提问,没人理吗?

ligongxiaobie 发表于 2017-12-16 15:56:41

请斑竹帮忙看下呗。这个应该是通病,不是个例吧

creep 发表于 2017-12-16 21:34:23

修改函数自己判断,参考下面的例子。

高速USB VCP和全速USB VCP 速度对比
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=609496&fromuid=394920
(出处: 意法半导体STM32/STM8技术社区)

ligongxiaobie 发表于 2017-12-18 14:29:39

creep 发表于 2017-12-16 21:34
修改函数自己判断,参考下面的例子。

高速USB VCP和全速USB VCP 速度对比


谢谢前辈指点,刚看到你的帖子的时候,我用CUBE 生成了一个CDC的虚拟串口,然后把您的usbd_cdc_interface.c函数放到工程中,确实随便发,不出堵的问题。
后来一想,发现原来是每64个字节是需要等一下的,这应该就是包发送的方法吧,之前也想到了用USB_Tx_State(我的那个工程是这样起名字的),但是那个是每APP_TX_DATA_SIZE等待一次,而不是这里的USB_PACK_SIZE 等待一次,就差在这里,我可以通过这个路子再试试。
谢谢,前辈!
另外问一个题外话,请问前辈,keil能在工程下的文件夹下面再次建立子文件夹吗?

maxtch 发表于 2017-12-18 15:38:42

传输完毕有中断的

creep 发表于 2017-12-18 15:52:38

ligongxiaobie 发表于 2017-12-18 14:29
谢谢前辈指点,刚看到你的帖子的时候,我用CUBE 生成了一个CDC的虚拟串口,然后把您的usbd_cdc_interface ...

目前keil还不能在工程下的文件夹下面再次建立子文件夹。

ligongxiaobie 发表于 2017-12-19 08:56:36

maxtch 发表于 2017-12-18 15:38
传输完毕有中断的

请问前辈您说的中断在哪里呢?我用CUBE生成的CDC输出是自己写的。

ctang 发表于 2017-12-19 09:20:13

static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len)
{
/* USER CODE BEGIN 6 */
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf);
USBD_CDC_ReceivePacket(&hUsbDeviceFS);

uint8_t res;
uint8_t i;
for(i=0; i<Len;i++)
{
    res=Buf;
    USB_USART_RX_Buffer=res;
    USB_USART_RX_STA++;
}
   USB_USART_RX_STA |= 0x8000;

return (USBD_OK);
/* USER CODE END 6 */
}

然后main函数去轮询 if(USB_USART_RX_STA&0x8000)。

ligongxiaobie 发表于 2017-12-19 09:29:28

ctang 发表于 2017-12-19 09:20
然后main函数去轮询 if(USB_USART_RX_STA&0x8000)。

嗯,应该可用,那么发送完毕有中断吗?
页: [1] 2
查看完整版本: usb虚拟串口,如何判断数据是否被搬运完毕