dongchengya 发表于 2024-3-7 20:49:58

必须在上微机打开串口才能正常输出,关闭上位机串口软件后,stc单片机其他线程收到影响,立即停止工作

dongchengya 发表于 2024-3-7 20:57:34

请今日参与验证的大佬。按照上述描述,在指定位置增加
printf("问题就在这一行,增加这一行就无法正常运行");
目的是让cdc串口,持续输出一串字符,
观察上位机串口软件开启与关闭时,
led灯线程,是否还能正常工作?
我看到上述实验没有影响,可能是我没有说清楚,
需要在指定位置加上一句printf 函数,以使cdc串口能主动的持续的发出一串字符

dongchengya 发表于 2024-3-8 08:44:28

gentleman 发表于 2024-3-7 14:58
写了个闪灯任务

与USB任务 互不影响


早上好,在线等 。。

55337575 发表于 2024-3-8 09:18:35

本帖最后由 55337575 于 2024-3-8 09:20 编辑

dongchengya 发表于 2024-3-8 08:44
早上好,在线等 。。
我自己修改了一下例子的程序,你参考一下

#include "stc.h"
#include "usb.h"
#include "usb_req_class.h"

//USN数据发送进程
void USB_SendData(BYTE *buf,u16 bl)
{
      BYTE num;
      
      while(bl)
      {
                num=(bl>(EP1IN_SIZE-1)?EP1IN_SIZE:bl);
                bl-=num;
                while(num)
                {
                        if(UsbInBusy) continue;
                        TxBuffer = *buf++;
                        num--;
                }               
      }
}


//USB口收发监视进程。发送通过USB_SendData()函数填充缓冲区;
//接收数据自动完成,数据填充到USB_RevDataBuf[]缓冲区,
//数据长度为USB_RevDataLong,该参数在数据处理完成后由软件清零
void USB_polling()               
{
    BYTE cnt;

    if (DeviceState != DEVSTATE_CONFIGURED)
      return;

    if (!UsbInBusy && (TxRptr != TxWptr))
    {
      EUSB = 0;
      UsbInBusy = 1;
      usb_write_reg(INDEX, 1);
      cnt = 0;
      while (TxRptr != TxWptr)
      {
            usb_write_reg(FIFO1, TxBuffer);
            cnt++;
            if (cnt == EP1IN_SIZE) break;
      }
      usb_write_reg(INCSR1, INIPRDY);
      EUSB = 1;
    }

    while(RxRptr != RxWptr)
                {
                        USB_RevDataBuf = RxBuffer;
                }                        

    if (UsbOutBusy)
    {
      EUSB = 0;
      if (RxWptr - RxRptr < 256 - EP1OUT_SIZE)
      {
            UsbOutBusy = 0;
            usb_write_reg(INDEX, 1);
            usb_write_reg(OUTCSR1, 0);
      }
      EUSB = 1;
    }
}

接收监视一直循环,发送随机


void main()
{

        WTST = 0;//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1; //扩展寄存器(XFR)访问使能
    CKCON = 0; //提高访问XRAM速度

    usb_init();
    EA = 1;
          
    while (1)
    {
                        USB_polling();
                       USB_SendData("1234567890",10);       
Delay1000ms();
                       
                        USB_SendData(USB_RevDataBuf,USB_RevDataLong);
                        USB_RevDataLong=0;
    }
}


dongchengya 发表于 2024-3-8 09:40:27

55337575 发表于 2024-3-8 09:18
我自己修改了一下例子的程序,你参考一下

#include "stc.h"


我看看,谢

dongchengya 发表于 2024-3-8 09:50:45

55337575 发表于 2024-3-8 09:18
我自己修改了一下例子的程序,你参考一下

#include "stc.h"


从长远的角度讲,是不是这个 USB-CDC 库 需要改进一下?

55337575 发表于 2024-3-8 10:02:53

本帖最后由 55337575 于 2024-3-8 10:07 编辑

dongchengya 发表于 2024-3-8 09:50
从长远的角度讲,是不是这个 USB-CDC 库 需要改进一下?
个人感觉不需要,CDC本身是服务于串口的,所以同串口关联是应该的。我只是需要直接通过串口收发数据所以改了一下。去除了所有串口关联子程,这样我可以嵌套到程序中了。而且这个过程同波特率无关。

dongchengya 发表于 2024-3-8 10:08:56

本帖最后由 dongchengya 于 2024-3-8 10:20 编辑


stc_usb_cdc_32.LIB这个新的USB-CDC库是 官方提供的新版本 USB库文件,下载地址为:https://www.stcai.com/khs

stc_usb_cdc_32g.LIB这个早一点的USB-CDC库是在 FreeRTOS-USB-CDC 中提供的,下载地址为:   https://www.stcai.com/xtrj
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
现在需要在 FreeRTOS-库函数版本 中使用 USB-CDC 库文件, 如果使用FreeRTOS-USB-CDC 中提供的stc_usb_cdc_32g.LIB 这个库文件 就会出现问题,具体如下:
stc_usb_cdc_32g.LIB   在使用的时候会出现上述 LED灯线程不工作的情况 ,尝试使用新一点的stc_usb_cdc_32.LIB ,


但是编译无法通过,提示如下:

linking...
*** ERROR L127: UNRESOLVED EXTERNAL SYMBOL
    SYMBOL:usb_OUT_done?_
    MODULE:.\Objects\usb_cdc.obj (usb_cdc)
*** ERROR L127: UNRESOLVED EXTERNAL SYMBOL
    SYMBOL:USB_SendData?_
    MODULE:.\Objects\usb_cdc.obj (usb_cdc)
*** ERROR L127: UNRESOLVED EXTERNAL SYMBOL
    SYMBOL:usb_init?_
    MODULE:.\Objects\usb_cdc.obj (usb_cdc)
*** ERROR L128: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:usb_init?_
    MODULE:.\Objects\usb_cdc.obj (usb_cdc)
    ADDRESS: FF54C2H
*** ERROR L128: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:USB_SendData?_
    MODULE:.\Objects\usb_cdc.obj (usb_cdc)
    ADDRESS: FF54FDH
*** ERROR L128: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:usb_OUT_done?_
    MODULE:.\Objects\usb_cdc.obj (usb_cdc)
    ADDRESS: FF5510H
*** ERROR L128: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:USB_SendData?_
    MODULE:.\Objects\usb_cdc.obj (usb_cdc)
    ADDRESS: FF432AH
*** ERROR L128: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:USB_SendData?_
    MODULE:.\Objects\usb_cdc.obj (usb_cdc)
    ADDRESS: FF4369H
*** ERROR L128: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:USB_SendData?_
    MODULE:.\Objects\usb_cdc.obj (usb_cdc)
    ADDRESS: FF43CEH
*** ERROR L128: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:USB_SendData?_
    MODULE:.\Objects\usb_cdc.obj (usb_cdc)
    ADDRESS: FF440BH





dongchengya 发表于 2024-3-8 10:27:55

本帖最后由 dongchengya 于 2024-3-8 10:33 编辑

55337575 发表于 2024-3-8 10:02
个人感觉不需要,CDC本身是服务于串口的,所以同串口关联是应该的。我只是需要直接通过串口收发数据所以改 ...
这里有两个USB库,
旧一点的这个可以在 FressRTOS 中使用,但是会对其他线程有影响,
新一点的这个USB库 ,又不能在FreeRTOS编译通过,

感觉就是 新库和 FreeRTOS 不兼容 。
何故?何解?






dongchengya 发表于 2024-3-8 10:50:42

55337575 发表于 2024-3-8 09:18
我自己修改了一下例子的程序,你参考一下

#include "stc.h"


我另外发布一个帖子
页: 1 2 [3] 4
查看完整版本: stc32g USB CDC 如何单纯的发数据