BH4TDV 发表于 2025-7-28 10:35:13

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

在官网下载的,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;

      }
}


attach://110011.png
attach://110012.png
attach://110013.png
attach://110014.png
attach://110015.png


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

attach://110016.png

//在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();
                }



晓飛飛 发表于 2025-7-28 11:20:18

只保留一部分代码再测试看看

ercircle 发表于 2025-7-28 12:36:19


打开串口状态:


关闭串口状态,触发超时机制:


不想要这个超时,可以参考此帖:
https://www.stcaimcu.com/forum.php?mod=redirect&goto=findpost&ptid=19040&pid=177176

BH4TDV 发表于 2025-7-29 19:31:05

晓飛飛 发表于 2025-7-28 11:20
只保留一部分代码再测试看看

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

BH4TDV 发表于 2025-7-29 19:37:54

ercircle 发表于 2025-7-28 12:36
打开串口状态:



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

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


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

晓飛飛 发表于 2025-7-29 19:50:14

BH4TDV 发表于 2025-7-29 19:37
不好意思哈,2张截图,除了占用时间不一样,其他没看出啥区别,我是用的官网的250716 的USB库的DEMO,有劳 ...

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

BH4TDV 发表于 2025-7-29 19:55:42

晓飛飛 发表于 2025-7-29 19:50
不至于那么慢,我做的一个模拟量采集盒子,12位ADC,四个通道,采样率都是1KHz,用USB-CDC串口方式发送数 ...
我用的官网程序,编译是OK的,下载运行也正常,就是发送占用时间长,没法完全替代传统串口+CH340的方式,其实我是想省掉CH340这个{:xieyanxiao:}


官网的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;

      }
}


ercircle 发表于 2025-7-29 21:51:12

BH4TDV 发表于 2025-7-29 19:55
我用的官网程序,编译是OK的,下载运行也正常,就是发送占用时间长,没法完全替代传统串口+CH340的方式, ...

拿这个测,us级别:

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

sbit LED_0 = P2 ^ 0;
sbit LED_1 = P2 ^ 1;
extern void usb_write_reg(BYTE addr, BYTE dat);
extern BYTE usb_read_reg(BYTE addr);

u8 isCDCOpen(){
        u8 result = 0;   
        if (DeviceState != DEVSTATE_CONFIGURED){
                        return 0;
        }
        IE2 &= ~0x80;
        usb_write_reg(INDEX, 1);
        if (!(usb_read_reg(INCSR1) & INIPRDY)){
                result = 1;
        }       
        IE2 |= 0x80;
        return result ;
}

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);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
                                        LED_1 = 0;
                                                USB_SendData("12345678\r\n", 10); //测试发送10个字节
                                                LED_1 = 1;
            usb_OUT_done();
      }
                               
                                LED_0 = 0;
                                if(isCDCOpen()){
                                        USB_SendData("12345678\r\n", 10);//测试发送10个字节
                                }
                                LED_0 = 1;
    }
}


BH4TDV 发表于 2025-8-1 12:12:48

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

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


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

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

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

                        }






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延时,否则丢包

                        }
                }

      }


}


xiangzichen 发表于 2025-8-2 10:20:55

BH4TDV 发表于 2025-7-29 19:37
不好意思哈,2张截图,除了占用时间不一样,其他没看出啥区别,我是用的官网的250716 的USB库的DEMO,有劳 ...

我之前ch340+stc8c的方案,115200的波特率,和上位机一直通信,改成stc8h2k的cdc,效率非常之高,一点问题没有.只是我的库是老得,因为没啥问题,从来没有用新库测试过.
页: [1]
查看完整版本: 求解CDC USB发送10个字节非常慢 ,需要80ms的问题