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

【USB-CDC虚拟串口协议范例如何才能触发串口的接收中断(RI = 1)?】

[复制链接]

7

主题

10

回帖

89

积分

注册会员

积分
89
发表于 2024-10-28 20:52:57 | 显示全部楼层 |阅读模式
USB-CDC虚拟串口协议范例里,如何才能触发串口的接收中断(RI = 1)?
截图202410282041336786.jpg
截图202410282052431296.jpg
普通串口是数据发送至SBUF缓冲区后触发接收中断,但是虚拟串口是数据发送到USB的FIFO缓冲区,怎么发送到SBUF缓冲区呢?



我看协议范例里面的数据接收过程:
USB的FIFO缓冲区→数组RxBuffer[]→字节变量dat→串口数据缓冲区S2BUF→串口发送中断(TI = 1)
发送到哪里去了呢?USB吗?

串口接收中断又如何触发的,求解答
截图202410282041269499.jpg

uart.c

3.7 KB, 下载次数: 154

usb.c

10.45 KB, 下载次数: 157

回复

使用道具 举报 送花

已绑定手机

23

主题

278

回帖

1854

积分

金牌会员

积分
1854
发表于 2024-10-28 22:11:59 来自手机 | 显示全部楼层
串口2的RX引脚接收到数据,就可以触发中断了
回复

使用道具 举报 送花

已绑定手机

96

主题

7378

回帖

1万

积分

超级版主

积分
14037
发表于 2024-10-29 01:58:50 | 显示全部楼层
CDC和SBUF无关,SBUF是硬件串口的
截图202410290156415735.jpg

电脑通过USB CDC发送到单片机,单片机接收并转发到硬件串口,从UART2 TxD的某个引脚输出了
串口接收中断是UART2 RxD引脚收到数据后触发
回复

使用道具 举报 送花

已绑定手机

96

主题

7378

回帖

1万

积分

超级版主

积分
14037
发表于 2024-10-29 02:01:11 | 显示全部楼层
CDC库函数中断模式
接收到数据会调用usb_OUT_callback函数
发送数据调用USB_SendData函数
回复

使用道具 举报 送花

7

主题

10

回帖

89

积分

注册会员

积分
89
 楼主| 发表于 2024-10-29 20:23:36 | 显示全部楼层
邮*** 发表于 2024-10-28 22:11
串口2的RX引脚接收到数据,就可以触发中断了

虚拟串口的RX引脚没有接东西怎么触发中断
回复

使用道具 举报 送花

7

主题

10

回帖

89

积分

注册会员

积分
89
 楼主| 发表于 2024-10-29 20:40:10 | 显示全部楼层
Debu*** 发表于 2024-10-29 01:58
CDC和SBUF无关,SBUF是硬件串口的

协议范例里面是CDC接收到的数据写到SBUF里了,  虚拟串口RXD引脚没接东西可以触发吗

点评

手动置位中断标志触发  详情 回复 发表于 2024-10-29 23:14
回复

使用道具 举报 送花

已绑定手机

96

主题

7378

回帖

1万

积分

超级版主

积分
14037
发表于 2024-10-29 23:14:21 | 显示全部楼层
23746*** 发表于 2024-10-29 20:40
协议范例里面是CDC接收到的数据写到SBUF里了,  虚拟串口RXD引脚没接东西可以触发吗 ...

手动置位中断标志触发
回复

使用道具 举报 送花

0

主题

5

回帖

40

积分

新手上路

积分
40
发表于 2026-9-20 10:57:32 | 显示全部楼层

******************************************/

#include "../comm/AI8051U.h"
#include "../comm/usb.h"     //USB调试及复位所需头文件
   
//==========================================================================


/*************  本地常量声明    **************/

#define MAIN_Fosc       24000000L   //定义主时钟

/*************  IO口定义    **************/


/*************  本地变量声明    **************/

//USB调试及复位所需定义
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";  //设置自动复位到ISP区的用户接口命令

/*************  本地函数声明    **************/

void delay_ms(u8 ms);
  
/**************** 中断模式,回调*****************/


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

    RSTFLAG |= 0x04;   //软复位标志写1清零,设置硬件复位后需要检测P3.2的状态选择运行区域,硬件复位后进入系统ISP检测到P3.2为低电平,才会进入USB下载模式

    P0M1 = 0x00;   P0M0 = 0xff;   //设置为推挽输出
    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();
       
    IE2 |= EUSB; //EUSB = 1;       //允许USB中断(B7位)
    EA = 1;
    P40 = 0;        //LED Power On
       

       
    while(1)
    {


        P26 = 0;        //LED On
        delay_ms(250);
        P26 = 1;        //LED Off

        P27 = 0;        //LED On
        delay_ms(250);
        P27 = 1;        //LED Off
               
               
                if (bUsbOutReady)               //查询是否有接收到数据
        {
                                       
                        if (UsbOutBuffer[0] == '6')
                                printf("World !\r\n");
                        else if (UsbOutBuffer[0] == '7')
                                printf("China !\r\n");       
                       
                        printf("Receive:") ;                
                        USB_SendData(UsbOutBuffer, OutNumber);
                       
            usb_OUT_done();             //当前包的数据处理完成
        }


         


    }
}

//========================================================================
// 函数: void delay_ms(u8 ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期: 2022-6-3
// 备注:
//========================================================================
void delay_ms(u8 ms)
{
    u16 i;
    do{
        i = MAIN_Fosc / 6000;
        while(--i);   //6T per loop
    }while(--ms);
}
这个是我用查询的方式 ,可以正常读写串口CDC。  中断方式已经试过了, 不行!
回复

使用道具 举报 送花

0

主题

5

回帖

40

积分

新手上路

积分
40
发表于 2026-9-20 11:00:25 | 显示全部楼层
#include "config.h"                     //默认已包含stdio.h、intrins.h等头文件

////////////////////////////////////////
// 项目主函数
////////////////////////////////////////
void main(void)
{

    SYS_Init();

    while (1)
    {

    }
}

void SYS_Init(void)
{
    EnableAccessXFR();                  //使能访问扩展XFR
    AccessCodeFastest();                //设置最快速度访问程序代码
    AccessIXramSpeed(1);                //设置访问内部XDATA的速度(如果不使能DMA,可将参数设置为0)
    IAP_SetTimeBase();                  //设置IAP等待参数,产生1us时基


    PORT3_Init();                       //P3口初始化
    delay_ms(1);
    USBLIB_Init();                      //USB库初始化
    delay_ms(1);

    EnableGlobalInt();                  //使能全局中断
    USBLIB_WaitConfiged();              //等待USB完成配置
}

void delay_us(uint16_t us)
{
    do
    {
        NOP(34);                        //(MAIN_Fosc + 500000) / 1000000 - 6
    } while (--us);
}


////////////////////////////////////////
void delay_ms(uint16_t ms)
{
    uint16_t i;

    do
    {
        i = MAIN_Fosc / 6000;
        while (--i);
    } while (--ms);
}


void PORT3_Init(void)
{
    SetP3nInitLevelHigh(PIN_ALL);       //设置P3初始化电平
    SetP3nQuasiMode(PIN_7 | PIN_6 | PIN_5 | PIN_4 | PIN_3 | PIN_2); //设置P3.7,P3.6,P3.5,P3.4,P3.3,P3.2为准双向口模式
    SetP3nHighZInputMode(PIN_1 | PIN_0); //设置P3.1,P3.0为高阻输入模式
    SetP3nManualMode(PIN_ALL);          //设置P3手动配置端口模式

    DisableP3nPullUp(PIN_ALL);          //关闭P3内部上拉电阻
    DisableP3nPullDown(PIN_ALL);        //关闭P3内部下拉电阻
    EnableP3nSchmitt(PIN_ALL);          //使能P3施密特触发
    SetP3nSlewRateNormal(PIN_ALL);      //设置P3一般翻转速度
    SetP3nDrivingNormal(PIN_ALL);       //设置P3一般驱动能力
    SetP3nDigitalInput(PIN_ALL);        //使能P3数字信号输入功能

}

void USBLIB_Init(void)
{
    usb_init();                         //初始化USB模块
    USB_SetIntPriority(3);              //设置中断为最高优先级
    set_usb_OUT_callback(USBLIB_OUT_Callback); //设置USB中断回调函数
    set_usb_ispcmd("@STCISP#");         //设置USB不停电下载命令

}


void USBLIB_WaitConfiged(void)
{
    while (DeviceState != DEVSTATE_CONFIGURED) //等待USB完成配置
        WDT_Clear();                    //清看门狗定时器 (防止硬件自动使能看门狗)
}

void USBLIB_OUT_Callback(void)
{

    USB_SendData(UsbOutBuffer, OutNumber); //原路返回, 用于测试
  
} 这个是我用中断方式实现USB CDC 通讯, 没有问题!  记得用#include "AI8051U.H"
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <float.h>
#include <intrins.h>

#include "def.h"
#include "ai8051u_def.h"
#include "ai_usb.h"  才能成功!
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-11-7 12:48 , Processed in 0.080143 second(s), 86 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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