找回密码
 立即注册
查看: 112|回复: 8

求解CDC USB发送10个字节非常慢 ,需要80ms的问题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-08-01 12:12:48
已绑定手机

1

主题

12

回帖

47

积分

新手上路

积分
47
发表于 4 天前 | 显示全部楼层 |阅读模式
在官网下载的,https://www.stcai.com/khs
USB库文件20250716版本,使用自带DEMO程序,
使用Ai8H8K64U-64PIN,

STC-CDC范例程序(查询方式)
stc8h_cdc_xdata_query_demo
stc8h_cdc_xdata_query_demo.uvproj

实测USB_SendData  不同位置,发送一个速度不一样,求解


#include "stc8h.h"
#include "stc32_stc8_usb.h"


sbit LED_0 = P2 ^ 0;
sbit LED_1 = P2 ^ 1;

void main()
{
    P_SW2 |= 0x80;

    P0M1 = 0x00;
    P0M0 = 0x00;
    P1M1 = 0x00;
    P1M0 = 0x00;
    P2M1 = 0x00;
    P2M0 = 0x00;
    P3M1 = 0x00;
    P3M0 = 0x00;
    P4M1 = 0x00;
    P4M0 = 0x00;
    P5M1 = 0x00;
    P5M0 = 0x00;
    P6M1 = 0x00;
    P6M0 = 0x00;
    P7M1 = 0x00;
    P7M0 = 0x00;

    usb_init();                                     //USB CDC 接口配置

    EA = 1;

    while(1)
        {
            if(bUsbOutReady)
                {
                    // USB_SendData(UsbOutBuffer, OutNumber);  //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
                 
                 //实测USB发送10个字节占用45us
                   LED_1 = 0;
                    USB_SendData("12345678\r\n", 10); //测试发送10个字节
                    LED_1 = 1;

                    usb_OUT_done();
                }

            //实测USB发送10个字节占用80ms  
            LED_0 = 0;
            USB_SendData("12345678\r\n", 10);//测试发送10个字节
            LED_0 = 1;

        }
}


https://www.stcaimcu.com/forum.php?mod=attachment&aid=MTEwMDExfDEwNWUyOTY1fDE3NTQwNDk4NzR8MHw%3D
https://www.stcaimcu.com/forum.php?mod=attachment&aid=MTEwMDEyfGMxNDk5ODM1fDE3NTQwNDk4NzR8MHw%3D
https://www.stcaimcu.com/forum.php?mod=attachment&aid=MTEwMDEzfDhmZjZlNzc2fDE3NTQwNDk4NzR8MHw%3D
https://www.stcaimcu.com/forum.php?mod=attachment&aid=MTEwMDE0fGU5NzRlMDc4fDE3NTQwNDk4NzR8MHw%3D
https://www.stcaimcu.com/forum.php?mod=attachment&aid=MTEwMDE1fGUwZGEyYTc3fDE3NTQwNDk4NzR8MHw%3D


//实测USB发送10个字节占用80ms  
            LED_0 = 0;
            USB_SendData("12345678\r\n", 10);//测试发送10个字节
            LED_0 = 1;

https://www.stcaimcu.com/forum.php?mod=attachment&aid=MTEwMDE2fDU4ZmYyZDBmfDE3NTQwNDk4NzR8MHw%3D

//在bUsbOutReady接收中发送,就很快

if(bUsbOutReady)
                {
                    // USB_SendData(UsbOutBuffer, OutNumber);  //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
                 
                                                                         //实测USB发送10个字节占用45us
                                                                                LED_1 = 0;
                    USB_SendData("12345678\r\n", 10); //测试发送10个字节
                    LED_1 = 1;

                    usb_OUT_done();
                }



微信截图_20250728100054.png
微信截图_20250728100128.png
微信截图_20250728100149.png
微信截图_20250728102231.png
微信截图_20250728101729.png
微信截图_20250728102110.png
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:501
  • 最近打卡:2025-08-01 01:53:57
已绑定手机

38

主题

2370

回帖

3086

积分

荣誉版主

积分
3086
发表于 4 天前 | 显示全部楼层
只保留一部分代码再测试看看
截图202507281120152293.jpg
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:254
  • 最近打卡:2025-08-01 08:52:46
已绑定手机

78

主题

2779

回帖

5722

积分

荣誉版主

无情的代码机器

积分
5722
发表于 4 天前 | 显示全部楼层

打开串口状态:
截图202507281233257067.jpg

关闭串口状态,触发超时机制:
截图202507281234036639.jpg

不想要这个超时,可以参考此帖:
https://www.stcaimcu.com/forum.p ... 9040&pid=177176

三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-08-01 12:12:48
已绑定手机

1

主题

12

回帖

47

积分

新手上路

积分
47
发表于 3 天前 | 显示全部楼层
晓*** 发表于 2025-7-28 11:20
只保留一部分代码再测试看看

没用啊,上面接收后再转发,占用时间很短,下面正常发送,占用时间很长,根本没法用啊
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-08-01 12:12:48
已绑定手机

1

主题

12

回帖

47

积分

新手上路

积分
47
发表于 3 天前 | 显示全部楼层
erci*** 发表于 2025-7-28 12:36
打开串口状态:

不好意思哈,2张截图,除了占用时间不一样,其他没看出啥区别,我是用的官网的250716 的USB库的DEMO,有劳指点下

补充下,串口调试软件是打开状态,能正常接收显示数据,只是占用时间太长了


貌似看起来还只能用回传统串口直接打印,外挂CH340 ,没法实现完全替代CH340

点评

不至于那么慢,我做的一个模拟量采集盒子,12位ADC,四个通道,采样率都是1KHz,用USB-CDC串口方式发送数据,一点丢包卡顿都没有。  详情 回复 发表于 3 天前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:501
  • 最近打卡:2025-08-01 01:53:57
已绑定手机

38

主题

2370

回帖

3086

积分

荣誉版主

积分
3086
发表于 3 天前 | 显示全部楼层
BH4*** 发表于 2025-7-29 19:37
不好意思哈,2张截图,除了占用时间不一样,其他没看出啥区别,我是用的官网的250716 的USB库的DEMO,有劳 ...

不至于那么慢,我做的一个模拟量采集盒子,12位ADC,四个通道,采样率都是1KHz,用USB-CDC串口方式发送数据,一点丢包卡顿都没有。
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-08-01 12:12:48
已绑定手机

1

主题

12

回帖

47

积分

新手上路

积分
47
发表于 3 天前 | 显示全部楼层
晓*** 发表于 2025-7-29 19:50
不至于那么慢,我做的一个模拟量采集盒子,12位ADC,四个通道,采样率都是1KHz,用USB-CDC串口方式发送数 ...

我用的官网程序,编译是OK的,下载运行也正常,就是发送占用时间长,没法完全替代传统串口+CH340的方式,其实我是想省掉CH340这个


官网的USB 最新250716库的DEMO ,8H8K64U ,只加了2个LED输出,用于逻辑分析仪测量,其他没做任何修改



#include "stc8h.h"
#include "stc32_stc8_usb.h"


sbit LED_0 = P2 ^ 0;
sbit LED_1 = P2 ^ 1;

void main()
{
    P_SW2 |= 0x80;

    P0M1 = 0x00;
    P0M0 = 0x00;
    P1M1 = 0x00;
    P1M0 = 0x00;
    P2M1 = 0x00;
    P2M0 = 0x00;
    P3M1 = 0x00;
    P3M0 = 0x00;
    P4M1 = 0x00;
    P4M0 = 0x00;
    P5M1 = 0x00;
    P5M0 = 0x00;
    P6M1 = 0x00;
    P6M0 = 0x00;
    P7M1 = 0x00;
    P7M0 = 0x00;

    usb_init();                                     //USB CDC 接口配置

    EA = 1;

    while(1)
        {
            if(bUsbOutReady)
                {
                    // USB_SendData(UsbOutBuffer, OutNumber);  //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
                 
                 //实测USB发送10个字节占用45us
                   LED_1 = 0;
                    USB_SendData("12345678\r\n", 10); //测试发送10个字节
                    LED_1 = 1;

                    usb_OUT_done();
                }

            //实测USB发送10个字节占用80ms  
            LED_0 = 0;
            USB_SendData("12345678\r\n", 10);//测试发送10个字节
            LED_0 = 1;

        }
}


点评

拿这个测,us级别:  详情 回复 发表于 3 天前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:254
  • 最近打卡:2025-08-01 08:52:46
已绑定手机

78

主题

2779

回帖

5722

积分

荣誉版主

无情的代码机器

积分
5722
发表于 3 天前 | 显示全部楼层
BH4*** 发表于 2025-7-29 19:55
我用的官网程序,编译是OK的,下载运行也正常,就是发送占用时间长,没法完全替代传统串口+CH340的方式, ...

拿这个测,us级别:

  1. #include "stc8h.h"
  2. #include "stc32_stc8_usb.h"
  3. sbit LED_0 = P2 ^ 0;
  4. sbit LED_1 = P2 ^ 1;
  5. extern void usb_write_reg(BYTE addr, BYTE dat);
  6. extern BYTE usb_read_reg(BYTE addr);
  7. u8 isCDCOpen(){
  8.         u8 result = 0;   
  9.         if (DeviceState != DEVSTATE_CONFIGURED){
  10.                         return 0;
  11.         }
  12.         IE2 &= ~0x80;
  13.         usb_write_reg(INDEX, 1);
  14.         if (!(usb_read_reg(INCSR1) & INIPRDY)){
  15.                 result = 1;
  16.         }       
  17.         IE2 |= 0x80;
  18.         return result ;
  19. }
  20. void main()
  21. {
  22.     P_SW2 |= 0x80;
  23.    
  24.     P0M1 = 0x00;   P0M0 = 0x00;
  25.     P1M1 = 0x00;   P1M0 = 0x00;
  26.     P2M1 = 0x00;   P2M0 = 0x00;
  27.     P3M1 = 0x00;   P3M0 = 0x00;
  28.     P4M1 = 0x00;   P4M0 = 0x00;
  29.     P5M1 = 0x00;   P5M0 = 0x00;
  30.     P6M1 = 0x00;   P6M0 = 0x00;
  31.     P7M1 = 0x00;   P7M0 = 0x00;
  32.    
  33.     usb_init();                                     //USB CDC 接口配置
  34.    
  35.     EA = 1;
  36.     while (1)
  37.     {
  38.         if (bUsbOutReady)
  39.         {
  40.             //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
  41.                                           LED_1 = 0;
  42.                                                 USB_SendData("12345678\r\n", 10); //测试发送10个字节
  43.                                                 LED_1 = 1;
  44.             usb_OUT_done();
  45.         }
  46.                                
  47.                                 LED_0 = 0;
  48.                                 if(isCDCOpen()){
  49.                                         USB_SendData("12345678\r\n", 10);//测试发送10个字节
  50.                                 }
  51.                                 LED_0 = 1;
  52.     }
  53. }
复制代码


三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-08-01 12:12:48
已绑定手机

1

主题

12

回帖

47

积分

新手上路

积分
47
发表于 7 小时前 | 显示全部楼层
//经过反复实测,发送后起码加100us延时,否则丢包
//貌似发送数据后,才会更新端口打开还是关闭状态,所以每次打开端口,会多显示之前的一行数据

//    感觉  isCDCOpen()  是发送数据后,才会检测到端口状态,而不是发送数据前能检测到端口状态


  if(isCDCOpen() == 1) //貌似发送数据后,才会更新端口打开还是关闭状态
                        {

                            LED_0 = 0; //测试脚
                            printf_usb("usb tx test %05d \r\n", i);
                            LED_0 = 1; //测试脚

                            Delay100us_test(); //发送后起码加100us延时,否则丢包

                        }

wechat_2025-08-01_120323_788.png

微信图片_20250801120336_8.png


void USB_FUN()        //处理USB接收到的数据 ,解析数据
{

    u16 i;

    if(bUsbOutReady)
        {
            LED_0 = 0;
            USB_SendData(UsbOutBuffer, OutNumber);  //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            LED_0 = 1;
            usb_OUT_done();
        }




    if(TIME_1S > 0) //每隔1秒发送一次数据
        {
            TIME_1S = 0;


            for(i = 0; i < 10; i++)
                {
                    if(isCDCOpen() == 1) //貌似发送数据后,才会更新端口打开还是关闭状态
                        {

                            LED_0 = 0; //测试脚
                            printf_usb("usb tx test %05d \r\n", i);
                            LED_0 = 1; //测试脚

                            Delay100us_test(); //发送后起码加100us延时,否则丢包

                        }
                }

        }


}


回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-8-1 20:04 , Processed in 0.129915 second(s), 108 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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