热烈的马 发表于 2023-4-9 16:26:16

STC8H8K64U虚拟串口CDC调用USB_SendData函数导致串口丢失问题

1、程序用于测试官方USB-CDC例程
2、测试芯片为STC8H8K64U
3、经测试发现如下问题
3.1、在main函数中配置USB-CDC后,立刻调用USB_SendData(BYTE *dat, int size)函数
      向上位机发送两条连续数据,上电后上位机能检查到串口但无法打开
3.21、在while(1)循环内无延时调用USB_SendData(BYTE *dat, int size)函数
          向上位机发送连续数据,上电后上位机能检查到串口但无法打开

程序如下
#include "STC8xxxx.H"
#include "stc32_stc8_usb.h"

#define MAIN_Fosc                11059200UL

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#"; //不停电自动 ISP 下载命令

void delay_ms(u8 ms)        //延时0~65535ms
{
   u16 i;
   do{
          i = MAIN_Fosc / 10000;
          while(--i);
   }while(--ms);
}

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;
        P3M0 &= ~0x03; //P3.0/P3.1 和 USB 的 D-/D+共用 PIN 脚,
        P3M1 |= 0x03; //需要将 P3.0/P3.1 设置为高阻输入模式
        IRC48MCR = 0x80; //使能内部 48M 的 USB 专用 IRC
        while (!(IRC48MCR & 0x01));
        USBCLK = 0x00; //设置 USB 时钟源为内部 48M 的 USB 专用 IRC
        USBCON = 0x90; //使能 USB 功能
        usb_init(); //调用 USB CDC 初始化库函数
        IE2 |= 0x80; //使能 USB 中断
        EA = 1;
        while (DeviceState != DEVSTATE_CONFIGURED); //等待 USB 完成配置
       
        WDT_CONTR = D_EN_WDT;                //使能看门狗
        WDT_PS_Set(D_WDT_SCALE_64);                                //看门狗定时器时钟分频系数64
        WDT_CONTR &= ~0x08;                        //IDLE模式停止计数
       
        USB_SendData("test",4);//发送一次,程序正常
//        USB_SendData("test",4);//发送两次,程序卡死
        while(1)
        {
               
      if (bUsbOutReady)
      {
            usb_OUT_done();    //接收应答(固定格式)
            USB_SendData(UsbOutBuffer,OutNumber);//原路返回, 用于测试
      }
               
                //有延时,程序正常,串口不丢失
                //没有延时,程序卡死,串口丢失
//                delay_ms(10);
//                USB_SendData("test",4);
                WDT_CONTR |= D_CLR_WDT;    // 喂狗
        }
}


乘风飞扬 发表于 2023-4-9 17:21:24

用附件的库文件试试看,如果没问题的话后续更新库文件。

热烈的马 发表于 2023-4-10 07:55:46

本帖最后由 热烈的马 于 2023-4-10 08:06 编辑

循环外部连续发送两次,程序正常了,但是在循环内发送间隔太短,如10ms,这时关闭串口,就会直接把usb卡掉,此时电脑提示usb设备异常。

乘风飞扬 发表于 2023-4-11 10:31:45

热烈的马 发表于 2023-4-10 07:55
循环外部连续发送两次,程序正常了,但是在循环内发送间隔太短,如10ms,这时关闭串口,就会直接把usb卡掉 ...

能不能提供具体的操作方法或代码?我有试过主循环里不加延时不断发送情况下,反复开关串口,没有遇到卡住的情况。

热烈的马 发表于 2023-4-12 19:15:26

本帖最后由 热烈的马 于 2023-4-13 07:25 编辑

乘风飞扬 发表于 2023-4-11 10:31
能不能提供具体的操作方法或代码?我有试过主循环里不加延时不断发送情况下,反复开关串口,没有遇到卡住 ...
程序就是我发的USB-CDC_TEST.rar的程序,把大循环里面的USB_SendData("test",4);打开重新编译就行了

lgwd 发表于 2023-4-13 10:53:01

即使是CDC串口,其实基础还是USB口。USB连接电脑的线非常重要。建议使用带屏蔽的和磁环滤波的USB线。排除USB线的问题再谈软硬件的问题。以前使用RS-232线,只要能连接、不短路就行。现在可不是这样!

神农鼎 发表于 2023-4-13 11:17:17

楼上过来人,吃过线的亏,用手机配的线可以,或用下图左边的线
https://www.stcaimcu.com/data/attachment/forum/202212/26/104232kwwx3w3uxwrueuxw.png

STC-USB Link1D /【专业仿真器,全自动在线下载器/自动停电上电,脱机烧录器,USB转双串口工具】
及全套 STC-ISP 下载生态线,高速下载,通信时间几乎忽略

热烈的马 发表于 2023-4-13 18:23:56

确实。模拟串口本质上还是usb,是usb就涉及主机轮询率。让usb工作在全速模式,主机轮询周期可降至125us,此时模拟串口的连续发包周期也随之降低,便可做到几乎无延时上传数据

神农鼎 发表于 2023-4-13 19:37:17





神农鼎 发表于 2023-4-13 19:38:58

12M bps, 线当然不能乱来,左边这条线是正规的 USB 线
https://www.stcaimcu.com/data/attachment/forum/202212/26/104232kwwx3w3uxwrueuxw.png

页: [1] 2
查看完整版本: STC8H8K64U虚拟串口CDC调用USB_SendData函数导致串口丢失问题