求解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();
}
只保留一部分代码再测试看看
打开串口状态:
关闭串口状态,触发超时机制:
不想要这个超时,可以参考此帖:
https://www.stcaimcu.com/forum.php?mod=redirect&goto=findpost&ptid=19040&pid=177176
晓飛飛 发表于 2025-7-28 11:20
只保留一部分代码再测试看看
没用啊,上面接收后再转发,占用时间很短,下面正常发送,占用时间很长,根本没法用啊 ercircle 发表于 2025-7-28 12:36
打开串口状态:
不好意思哈,2张截图,除了占用时间不一样,其他没看出啥区别,我是用的官网的250716 的USB库的DEMO,有劳指点下
补充下,串口调试软件是打开状态,能正常接收显示数据,只是占用时间太长了
貌似看起来还只能用回传统串口直接打印,外挂CH340 ,没法实现完全替代CH340
BH4TDV 发表于 2025-7-29 19:37
不好意思哈,2张截图,除了占用时间不一样,其他没看出啥区别,我是用的官网的250716 的USB库的DEMO,有劳 ...
不至于那么慢,我做的一个模拟量采集盒子,12位ADC,四个通道,采样率都是1KHz,用USB-CDC串口方式发送数据,一点丢包卡顿都没有。 晓飛飛 发表于 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;
}
}
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;
}
}
//经过反复实测,发送后起码加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延时,否则丢包
}
}
}
}
BH4TDV 发表于 2025-7-29 19:37
不好意思哈,2张截图,除了占用时间不一样,其他没看出啥区别,我是用的官网的250716 的USB库的DEMO,有劳 ...
我之前ch340+stc8c的方案,115200的波特率,和上位机一直通信,改成stc8h2k的cdc,效率非常之高,一点问题没有.只是我的库是老得,因为没啥问题,从来没有用新库测试过.
页:
[1]